微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用移动常量引用的可能性

如何解决使用移动常量引用的可能性

void foo (const std::string& str)
{
   std::string local = std::move(str);
}

我真的很困惑这是允许的。我是否遗漏了某些东西并且在某些情况下可以使用它?就像如果我知道移动这个字符串是安全的,我应该仍然使用这个构造,还是编译器允许但在现实生活中永远不应该使用它?

解决方法

从某种意义上说,这段代码在语法上是正确的。 std::move 只不过是一个美化的转换,它在转换时考虑了参数的类型。如果您的参数类型是 const &,则对象将被强制转换为相同的 const &&,并且当您调用

std::string local = std::move(str);

您最终调用了 std::string 的复制构造函数,因为它是唯一合适的重载(std::string::string(string&& ) 不是可行的候选者)。

最后,您的 move 什么也没做,可以看作是添加到代码中的语法噪音。

,

我是否遗漏了某些东西并且在某些情况下可以使用它?

它可以用于您可以使用的所有情况:

std::string local = str;

这实际上是相同的。

我还应该使用这种结构吗

没有。这样做将毫无意义且令人困惑。

在更复杂的示例中,类型是模板化的并且可以是常量或非常量,这是有道理的。这样你就可以从 const 复制并从非常量移动

就像我知道移动这个字符串是安全的

你没有移动绳子。你不能从 const xvalues 移动。

如果您知道移动字符串是安全的,则将右值引用传递给非常量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。