Должен ли конструктор перемещения вызывать std :: move ()?

Я столкнулся с некоторым кодом в нашем проекте, например:

class A {
public:
A(A&& obj): valid_(false), data_(obj.data_) {}
//...
void print() {
for (auto x : data_) cout<<x<<" ";
cout<<endl;
}
private:
bool valid_;
vector<int> data_;
};

Это допустимая реализация конструктора перемещения? Это необходимо использовать std::move() для переменных-членов в конструкторе перемещения в этом случае?

0

Решение

Важно помнить, что «lvalue» и «rvalue», а также зоопарк других «* значений» применяются не к переменным, а к выражения.

Выражение obj.data_ является выражением lvalue, и самый простой способ убедиться в этом — учесть, что &obj.data_ правильно сформирован, тогда как получение адреса выражения rvalue — нет.

Чтобы разрешить применение семантики перемещения, вы должны взять результат этого выражения lvalue и привести его через std :: move так, чтобы это было выражение rvalue, к которому фактически применяется семантика перемещения (для любого типа data_, который применяется).

Поэтому да, вы должны применить std :: move.

3

Другие решения

Вам нужно будет изменить data_(obj.data_) в data_(std::move(obj.data_)) или это будет копия построена; именованные переменные никогда не являются ссылками на r-значения, если они явно не перемещены (или переадресованы при соответствующих условиях); C ++ не будет применяться неявно move транзитивно к атрибутам объекта.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector