std :: move是否始终按预期工作?

时间:2017-06-20 09:39:13

标签: c++ c++11

据我所知std::move(与static_cast<T&&>相同)将变量转换为rvalue并分配给左值,因此我想在下面的代码中:

int a = 1;
int b = static_cast<int&&>(a);

ba具有相同的地址,但在VS中,它会打印不同的地址。

int a = 1;
int b = static_cast<int&&>(a);
cout << hex << &a << endl;
cout << hex << &b << endl;

如果此a仍然指向不同的内存位置,在这种情况下使用std::move有什么好处?

4 个答案:

答案 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现在是空的。