Несмотря на то, что в этом распространенном случае требуется std::move
, считалось, что неявное перемещение, вызывающее ошибку времени выполнения в некоторых случаях, будет более вредным.
Например:
class Y
{
public:
Y(const std::vector<int>& v);
};
class X {
std::vector<int> v_;
Y y_;
public:
X(std::vector<int>&& v): v_(v), y_(v) {}
};
В этом модифицированном примере конструктор X
дважды использует v
. Если первое использование v
неявно перемещено, то второе использование v
, скорее всего, не даст ожидаемого значения.
Таким образом, чтобы избежать случайного «использования после перемещения», если у него есть имя, его можно использовать более одного раза, и поэтому безопаснее рассматривать его как lvalue.