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

Is moved variable valid to use after std::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?

当你在 POD 类型上使用 std::move 时,没有什么特别的发生,它只是制作了一个普通的 copysource destination 仍然可用。

std::move 对 POD 没有任何作用。

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

a之后还是不错的

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

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

但是int是一个内置类型,没有这样的构造函数或operator=,所以将std::move应用到int不会导致它得到感动了。

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