温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - Why does moving a pointer variable not set it to null?
c++ c++11 pointers null move-semantics

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

发布于 2020-03-27 11:30:18

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

p = other.p;
other.p = 0;

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

p = std::move(other.p);

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

注:通过“移动”,我并不仅仅意味着子表达式std::move(other.p),我指的是整个表达式p = std::move(other.p)因此,为什么没有特殊的语言规则说“如果赋值的右侧是指针xvalue,则在赋值发生后将其设置为null”。

查看更多

查看更多

提问者
fredoverflow
被浏览
74
7,415 2015-07-18 03:19

将原始指针移动后将其设置为null意味着该指针代表所有权。但是,许多指针用于表示关系。而且,很长一段时间以来,建议所有权关系的表示方式与使用原始指针的方式不同。例如,您所指的所有权关系由表示std::unique_ptr<T>如果您希望隐式生成的移动操作照顾您的所有权,那么您所要做的就是使用实际上代表(并实现)所需所有权行为的成员。

同样,生成的移动操作的行为与复制操作的行为是一致的:它们也没有做任何所有权假设,例如,如果复制了指针,则不会进行深层复制。如果您希望这种情况发生,还需要创建一个编码相关语义的合适的类。