在实现 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/