使用可能性移动常量参考

Using possibility to move constant reference

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 什么也没做,可以看作是添加到代码中的句法噪音。

Am I missing something and in some cases it can be used?

它可以在所有可以使用的情况下使用:

std::string local = str;

这实际上是一样的。

should I still use this construction

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

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

移动

Like if I know that it's safe to move this string

您没有移动琴弦。您不能从 const xvalues 移动。

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