Одна из причин заключается в том, что использование операторов присваивания облегчает понимание того, что делает каждая строка. Если есть вызов функции somefunction(var1, var2, var3)
, неясно, модифицируются ли некоторые из них или нет. Чтобы узнать это, вы должны фактически прочитать другую функцию.
Кроме того, если вам нужно передать вектор в качестве аргумента в fill()
, это означает, что для каждого места, которое вызывает вашу функцию, потребуются две строки вместо одной: сначала создать пустой вектор, а затем позвонить fill()
.
Другая причина в том, что конструктор перемещения позволяет функции возвращать экземпляр класса, у которого нет конструктора по умолчанию. Рассмотрим следующий пример:
struct something{
something(int i) : value(i) {}
something(const something& a) : value(a.value) {}
int value;
};
something function1(){
return something(1);
}
void function2(something& other){
other.value = 2;
}
int main(void){
// valid usage
something var1(18);
// (do something with var1 and then re-use the variable)
var1 = function1();
// compile error
something var2;
function2(var2);
}
В случае, если вы обеспокоены тем, практичность, это не имеет значения ли вы написать fill()
возвращать значение, или взять выходной переменной в качестве параметра. Ваш компилятор должен оптимизировать его до наиболее эффективной альтернативы этих двух. Если вы подозреваете, что это не так, вам лучше измерить это.
Как вы думаете, никогда не нужно копировать объекты на C++? Если это так, вы делаете это неправильно. – juanchopanza
Одна из причин заключается в том, что читать гораздо проще. Если есть вызов функции 'somefunction (var1, var2, var3)', неясно, модифицируются некоторые из них или нет. –
Вы пытались сделать некоторые чтения по темам движущихся конструкторов и перенести семантику вообще? Существует множество информации, просто Google ... –