在实现移动构造函数和移动赋值运算符时,通常会编写以下代码:
p = other.p;
other.p = 0;
隐式定义的移动操作将使用以下代码实现:
p = std::move(other.p);
这是错误的,因为移动指针变量并不会将其设置为 null。为什么呢?是否有任何情况下我们希望移动操作后原始指针变量保持不变?
注意:在此,“移动”并不仅指子表达式 std::move(other.p)
,而是整个表达式 p = std::move(other.p)
。那么,为什么没有特殊的语言规则说:“如果赋值的右侧是一个指向 xvalue 的指针,则在赋值完成后它将被设置为 null。”?
delete p
,析构函数肯定不会忽略它。 - fredoverflowdelete p
,那么你想表达什么意思? - user743382std::swap
对两个指针进行交换是一个很好的例子,说明在不希望std::move
自动将指针置为 NULL 时应该如何操作。至于整数的“空”状态是什么?确实,编译器优化可以使std::swap
的情况再次达到理想状态,但我认为这些情况表明我们最好不要去改变它。 - Johannes Schaub - litb