3

这是一个简单的问题,但我无法在谷歌上找到它:

是否有整数类型的特殊移动构造函数(包括指针)

例如,如果我这样做:

int* a = new int(2);
int* b = std::move(a);

是否保证指向NULL?如果 a 和 b 是int怎么办?

4

3 回答 3

12

是保证指向 NULL 吗?

不,它将保持不变。内置类型的初始化永远不会修改初始化程序。只有使用移动构造函数(或邪恶的非常量复制构造函数,例如auto_ptr)初始化类类型才能修改它。

例如,如果您使用std::unique_ptr而不是哑指针,那么a在初始化b.

如果ab是整数呢?

仍然没有。

于 2013-08-14T14:59:52.170 回答
1

简单的回答,原始指针不是智能指针,所以不,简单类型的移动不会清除移动的值,或者至少不能保证这样做。为什么要移动一个原始指针设置一个从值移动到nullptr?它没有任何概念delete或双重delete可能是邪恶或不受欢迎的东西。移动只是保证使对象处于有效但未指定的状态,并使简单类型的移动比复制更复杂和低效肯定是违反直觉的。“为我存储地址”之上的任何语义都取决于特殊的智能指针类型,并且超出了简单原始指针的责任。

于 2013-08-14T15:08:49.983 回答
0

尽管请注意 - 在标准库中 - 移动意味着被移动的对象处于有效但未指定的状态。这意味着,在这样的操作之后,被移动对象的值应该只被销毁或分配一个新值;否则访问它会产生一个未指定的值

引自——http: //www.cplusplus.com/reference/utility/move/

因此,在您的指针情况下,a它处于未指定状态,因此它可以包含任何内容。为了使用a,我们需要给它一个新的值来指向

于 2013-08-14T14:58:39.393 回答