【问题标题】:std::move does not move for rvalue referencestd::move 不为右值引用移动
【发布时间】:2021-08-26 10:38:43
【问题描述】:

我是移动语义的新手。

当我运行以下代码时:

std::string h{"move"};
auto r = std::move(h);
std::cout << h << std::endl;
std::cout << r << std::endl;

我得到了预期的结果:

{empty line} 
move

但是当我运行这个时:

std::string h{"move"};
auto&& r = std::move(h);
std::cout << h << std::endl;
std::cout << r << std::endl;

虽然我希望得到与上面相同的输出,但我得到了输出:

move
move

为什么在这种情况下没有调用移动构造函数,并且值被设置为某个未指定的值?

【问题讨论】:

  • r 是一个引用,这意味着它引用了h。这个例子中只有一个物体,你认为移动会发生在哪里?

标签: c++ c++11 move move-semantics rvalue-reference


【解决方案1】:

std::move 本身什么也不做,只是将其参数转换为 T &amp;&amp;

这是因为您在第一个示例中将std::string &amp;&amp; 分配给r,导致h 的数据被移动。

在第二种情况下,您将 std::string &amp;&amp; 分配给 std::string &amp;&amp;,即引用。它是左值还是右值引用在这里并不重要。事实上,不需要创建std::string 对象,因此不会移动h 的数据。

【讨论】:

  • 我总是觉得很违反直觉,std::move 实际上并没有移动任何东西,它只是你在谈论的演员,而实际的移动发生在其他地方,当将 T&& 分配给 T 时。错误的命名c++ 标准人恕我直言的选择
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多