据我所知std::move
(与static_cast<T&&>
相同)将变量转换为rvalue并分配给左值,因此我想在下面的代码中:
int a = 1;
int b = static_cast<int&&>(a);
b
和a
具有相同的地址,但在VS中,它会打印不同的地址。
int a = 1;
int b = static_cast<int&&>(a);
cout << hex << &a << endl;
cout << hex << &b << endl;
如果此a
仍然指向不同的内存位置,在这种情况下使用std::move
有什么好处?
答案 0 :(得分:8)
仅仅因为你&#34;移动&#34;他们并不意味着他们将共享相同的地址。移动一个值是一个高级抽象,基本类型如int
移动和复制完全相同,这在这里发生。我建议你阅读excellent post on std::move,了解它的作用以及它的用途。
答案 1 :(得分:2)
不,b
是它自己的对象,它是从右值引用到另一个int的复制初始化。这与仅复制引用的对象相同。
移动语义仅在&#34;复制&#34;可以通过资源窃取来执行(因为我们知道其他对象存储即将进行)。
对于类似整数的类型,它仍然是纯文本。
答案 2 :(得分:0)
当您在std::move
中使用C++
时,不 移动对象本身,您移动 <对象的强>值或其内容。所以它的地址不会改变。
移动与使用int
进行复制没有什么不同。但是对于具有指向已分配内存的内部指针的复杂类型,可以使用std::move
传输而无需进行复制(假设它已设计为响应std::move
)。< / p>
答案 3 :(得分:0)
在int上使用std :: move没有任何好处。在您的示例中,您基本上将值从a复制到b。
移动语义仅对您要转移所有权的资源有意义,例如:动态分配内存。以std :: unique_ptr为例。
auto ptr = std::make_unique<int>(1);
auto ptrCopy = ptr; // copy will not work compilation error.
auto ptrMove = std::move(ptr);
在上面的例子中,ptrMove接管了ptr的所有权,而ptr现在是空的。