为什么移动指针变量不将其设置为null?

fre*_*low 41 c++ null pointers move-semantics c++11

在实现移动构造函数和移动赋值运算符时,通常会编写如下代码:

p = other.p;
other.p = 0;
Run Code Online (Sandbox Code Playgroud)

隐式定义的移动操作将使用以下代码实现:

p = std::move(other.p);
Run Code Online (Sandbox Code Playgroud)

这将是错误的,因为移动指针变量并没有将其设置为null.这是为什么?是否有任何情况我们希望移动操作保持原始指针变量不变?

注意:通过"移动",我只是表示子表达式std::move(other.p),我的意思是整个表达式p = std::move(other.p).那么,为什么没有特殊的语言规则说"如果赋值的右侧是指针xvalue,则在赋值发生后将其设置为null."?

Die*_*ühl 33

移动它后将原始指针设置为null意味着指针代表所有权.但是,许多指针用于表示关系.此外,长期以来,建议所有权关系的表示方式与使用原始指针的方式不同.例如,您所指的所有权关系由表示std::unique_ptr<T>.如果您希望隐式生成的移动操作处理您的所有权,您需要做的就是使用实际代表(并实现)所需所有权行为的成员.

此外,生成的移动操作的行为与复制操作的行为一致:它们也不做任何所有权假设,并且如果复制指针则不执行深度复制.如果您希望这种情况发生,您还需要创建一个编码相关语义的合适类.

  • 我只记得读过一篇文章说"移动应该永远不会比复制更昂贵"或类似的东西.将原始指针设置为null将破坏该规则.你知道我在谈论哪篇论文,还是我的大脑能够做到这一点? (4认同)

Lig*_*ica 6

移动会使移动的对象"无效".它并不会自动将其设置为一个安全的"空"的状态.按照C++长期以来的原则"不为你不使用的东西买单",如果你需要,那就是你的工作.