我对移动语义学是个新手。
当我运行以下代码时:
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为什么在这种情况下没有调用move构造函数,而是将值设置为某个未指定的值?
发布于 2021-06-09 20:37:55
std::move本身除了将其参数转换为T &&之外,什么也不做。
这是因为您在第一个示例中将std::string &&分配给了r,从而移动了h的数据。
在第二种情况下,您将一个std::string &&赋给一个std::string &&,即一个引用。它是一个左值引用还是右值引用在这里并不重要。事实上,不需要创建std::string对象,因此不会移动h的数据。
https://stackoverflow.com/questions/67903905
复制相似问题