如何解决std::move 不会为右值引用而移动
我是移动语义的新手。
当我运行以下代码时:
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
为什么在这种情况下没有调用移动构造函数并将值设置为某个未指定的值?
解决方法
std::move
本身什么都不做,只是将其参数转换为 T &&
。
这是因为您在第一个示例中将 std::string &&
分配给了 r
,从而移动了 h
的数据。
在第二种情况下,您将一个 std::string &&
分配给一个 std::string &&
,即一个引用。它是左值还是右值引用在这里并不重要。事实是不需要创建std::string
对象,因此h
的数据不会被移动。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。