Это разумное значение по умолчанию , если , вам нужно сделать копию внутри тела. Это то, что Дейв Абрахамс защищает :
Рекомендация: не копируйте аргументы вашей функции. Вместо этого передайте их по значению и позвольте компилятору выполнить копирование.
В коде это означает, что не делайте этого:
void foo(T const& t)
{
auto copy = t;
// ...
}
но сделайте это:
void foo(T t)
{
// ...
}
, преимущество которого в том, что вызывающий абонент может использовать foo
примерно так:
T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue
и только минимальная работа сделана. Вам потребуется две перегрузки, чтобы сделать то же самое со ссылками, void foo(T const&);
и void foo(T&&);
.
Имея это в виду, я теперь написал свои ценные конструкторы так:
class T {
U u;
V v;
public:
T(U u, V v)
: u(std::move(u))
, v(std::move(v))
{}
};
В противном случае передача по ссылке на const
все еще является разумной.