首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于右值引用,std::move不移动

对于右值引用,std::move不移动
EN

Stack Overflow用户
提问于 2021-06-09 20:11:10
回答 1查看 41关注 0票数 0

我对移动语义学是个新手。

当我运行以下代码时:

代码语言:javascript
复制
std::string h{"move"};
auto r = std::move(h);
std::cout << h << std::endl;
std::cout << r << std::endl;

我得到了预期的结果:

代码语言:javascript
复制
{empty line} 
move

但是,当我运行以下命令时:

代码语言:javascript
复制
std::string h{"move"};
auto&& r = std::move(h);
std::cout << h << std::endl;
std::cout << r << std::endl;

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

代码语言:javascript
复制
move
move

为什么在这种情况下没有调用move构造函数,而是将值设置为某个未指定的值?

EN

回答 1

Stack Overflow用户

发布于 2021-06-09 20:37:55

std::move本身除了将其参数转换为T &&之外,什么也不做。

这是因为您在第一个示例中将std::string &&分配给了r,从而移动了h的数据。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67903905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档