c++ - 为什么 move 指针变量不会将其设置为空?

标签 c++ pointers null c++11 move-semantics

在实现 move 构造函数和 move 赋值运算符时,经常会这样写代码:

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

隐式定义的 move 操作将使用如下代码实现:

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

这是错误的,因为 move 指针变量并将其设置为空。这是为什么?是否存在我们希望 move 操作保持原始指针变量不变的情况?

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

最佳答案

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

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

关于c++ - 为什么 move 指针变量不会将其设置为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9452503/

相关文章:

我可以看到指向 NULL 指针的值吗?

c++ - Lua 5.1 中缺少 luaL_len

c++ - 安装 VC++ 2010 无法解决 dll 加载问题

c++ - 为什么指向指针的指针是一个矩阵?

c - 从函数返回指针数组

c - 由于 void 指针和整数转换错误,pthread_create 无法工作

swift - 从 NSManagedObject 中删除 Nil 值

c++ - 依赖于其他 DLL 的插件 DLL

c++ - c++ : error: must use '.*' or '->*' to call pointer-to-member function in function 中的函数指针

javascript - ['null' ,'' ,'undefined' ].indexOf(str) < 0 和 (str !== null || str !== '' || str !== undefined) 等价吗?