使用可能性移动常量参考
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 移动。
如果您知道移动字符串是安全的,则将右值引用传递给非常量。
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 移动。
如果您知道移动字符串是安全的,则将右值引用传递给非常量。