Вызов move(x)
- самый канонический способ: конструктор базовых перемещений никогда не будет путаться с производными членами класса, не вызывая неопределенное поведение.
Обратите внимание, что «использование после перемещения» обычно допустимо, стандарт c ++ требует, чтобы «Если не указано иное, все объекты стандартной библиотеки, из которых были перемещены, помещались в допустимое, но неопределенное состояние».Это означает, что их функции-члены по-прежнему могут вызываться, если они не требуют предварительных условий.Рассмотрим пример:
vector<int> a = { 1, 2, 3 };
vector<int> b(std::move(a));
//std::cout << a.back(); <- Invalid call. We don't know whether a is empty.
a.clear(); // Ok. clear() doesn't require preconditions.
a.push_back(0); //Ok. Now a is { 0 }
Кроме того, для вызова деструктора обычно требуется действительность объекта (чего нельзя избежать, если объект имеет длительность автоматического хранения).