移动变量是否有效,可以在 std::move 之后使用



我很难理解我是否将 POD 从一个变量std::move到另一个变量,源变量是否仍然可以使用,或者它的行为是否类似于悬空指针? 它仍然指向堆栈内存吗?

例如:

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?

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

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

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

std::move

POD 没有任何作用。

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

在那之后,a仍然很好。

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

当您在POD类型上使用 std::move 时,不会发生任何特殊情况,它只是制作一个普通副本目标仍然可用。

最新更新