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
时,没有什么特别的发生,它只是制作了一个普通的 copy 和 source 和 destination 仍然可用。
std::move
对 POD 没有任何作用。
int a = 5;
int b = std::move(a);
a
之后还是不错的
对于非 POD 类型,移动的对象可能对某些操作有效而对其他操作无效 -- 这完全取决于移动构造函数或移动赋值运算符的作用。
请注意 std::move
不会移动其参数,它只是将其转换为右值引用。实际移动对象的是接受右值引用的构造函数或赋值运算符。
但是int
是一个内置类型,没有这样的构造函数或operator=
,所以将std::move
应用到int
不会导致它得到感动了。
抛开内置类型不谈,C++ 标准规定移出的对象应该处于有效但未指定的状态。通常,这意味着我们不能使用它的值,但可以重新分配它。
我很难理解如果我 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
时,没有什么特别的发生,它只是制作了一个普通的 copy 和 source 和 destination 仍然可用。
std::move
对 POD 没有任何作用。
int a = 5;
int b = std::move(a);
a
之后还是不错的
对于非 POD 类型,移动的对象可能对某些操作有效而对其他操作无效 -- 这完全取决于移动构造函数或移动赋值运算符的作用。
请注意 std::move
不会移动其参数,它只是将其转换为右值引用。实际移动对象的是接受右值引用的构造函数或赋值运算符。
但是int
是一个内置类型,没有这样的构造函数或operator=
,所以将std::move
应用到int
不会导致它得到感动了。
抛开内置类型不谈,C++ 标准规定移出的对象应该处于有效但未指定的状态。通常,这意味着我们不能使用它的值,但可以重新分配它。