这是一个简单的问题,但我无法在谷歌上找到它:
是否有整数类型的特殊移动构造函数(包括指针)
例如,如果我这样做:
int* a = new int(2);
int* b = std::move(a);
是否保证指向NULL?如果 a 和 b 是int
怎么办?
是保证指向 NULL 吗?
不,它将保持不变。内置类型的初始化永远不会修改初始化程序。只有使用移动构造函数(或邪恶的非常量复制构造函数,例如auto_ptr
)初始化类类型才能修改它。
例如,如果您使用std::unique_ptr
而不是哑指针,那么a
在初始化b
.
如果
a
和b
是整数呢?
仍然没有。
简单的回答,原始指针不是智能指针,所以不,简单类型的移动不会清除移动的值,或者至少不能保证这样做。为什么要移动一个原始指针设置一个从值移动到nullptr
?它没有任何概念delete
或双重delete
可能是邪恶或不受欢迎的东西。移动只是保证使对象处于有效但未指定的状态,并使简单类型的移动比复制更复杂和低效肯定是违反直觉的。“为我存储地址”之上的任何语义都取决于特殊的智能指针类型,并且超出了简单原始指针的责任。
尽管请注意 - 在标准库中 - 移动意味着被移动的对象处于有效但未指定的状态。这意味着,在这样的操作之后,被移动对象的值应该只被销毁或分配一个新值;否则访问它会产生一个未指定的值
引自——http: //www.cplusplus.com/reference/utility/move/
因此,在您的指针情况下,a
它处于未指定状态,因此它可以包含任何内容。为了使用a
,我们需要给它一个新的值来指向