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