在std :: move之后使用的移动变量是否有效?

时间:2019-03-29 05:57:33

标签: c++ move

我很难理解std::move POD从一个变量到另一个变量,源变量是否仍然可以使用还是它像悬挂指针一样起作用?它仍然指向堆栈内存吗?

例如:

int a = 5;
int b = std::move(a) // b owns a resources now

a = 10 // is this valid? does it have memory address?
std::cout << a; // prints 10 obviously valid?

4 个答案:

答案 0 :(得分:5)

请注意,std::move不会移动其参数,只是将其强制转换为右值引用。实际移动对象的是接受右值引用的构造函数或赋值运算符。

但是int是内置类型,没有这样的构造函数或operator=,因此将std::move应用于int不会使它移动。

除了内置类型之外,C ++标准还指出,移出的对象应处于有效但未指定的状态。通常,这意味着我们不能使用它的值,但是可以重新分配它。

答案 1 :(得分:4)

std::move对POD无效。

int a = 5;
int b = std::move(a);

a在那之后仍然不错。

对于非POD类型,已移动的对象可能对某些操作有效,而对其他操作无效-这都取决于move构造函数或move赋值运算符的作用。

答案 2 :(得分:3)

当您在std::move类型上使用POD时,没有什么特别的事情发生,它只会生成简单的 copy 以及 source 目的地仍然可用。

答案 3 :(得分:-1)

我认为对移动操作员的操作存在误解:

int b = std::move(a) // b owns a resources now
a = 10 // is this valid? does it have memory address?

这对任何类型均有效(只要移动辅助操作符和复制辅助操作符不会被覆盖以执行完全不同的操作)。

ab的地址由移动协助操作员从未更改

如果a的类型具有无效/无意义的状态(晃动的成员指针,...),那么在移动辅助之后a可能处于无效/无意义的状态状态。

如果复制协助操作者严格依赖复制目标的状态,并且移动协助已将a置于无效/无意义的状态,则复制协助可能会产生无效结果。

但这不是问题的范围,因为:

对于POD,移动辅助操作符和复制辅助操作符不是用户定义的。 因此有效。