При реализации конструкторов перемещения и операторов присваивания перемещения часто пишут такой код:
p = other.p;
other.p = 0;
Неявно определенные операции перемещения могут быть реализованы с помощью такого кода:
p = std::move(other.p);
Что было бы неверно, поскольку перемещение переменной-указателя делает , а не , установил значение null. Это почему? Есть ли случаи, когда мы хотели бы, чтобы при операциях перемещения исходная переменная-указатель оставалась неизменной?
Примечание: Под «перемещением» я подразумеваю , а не просто подвыражение std :: move ( other.p)
, я имею в виду все выражение p = std :: move (other.p)
. Итак, почему нет специального языкового правила, которое гласит: «Если правая часть присваивания является указателем xvalue, он устанавливается в ноль после того, как присваивание имело место»?