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>.如果您希望隐式生成的移动操作处理您的所有权,您需要做的就是使用实际代表(并实现)所需所有权行为的成员.
此外,生成的移动操作的行为与复制操作的行为一致:它们也不做任何所有权假设,并且如果复制指针则不执行深度复制.如果您希望这种情况发生,您还需要创建一个编码相关语义的合适类.
| 归档时间: |
|
| 查看次数: |
14590 次 |
| 最近记录: |