(一种)
std::string doNothing(const std::string&& s)
{
return std::move(s);
}
(B)
std::string doNothing(const std::string& s)
{
return std::move(s);
}
(测试)
const std::string str = "aaaaaa";
const auto str2 = doNothing(str);
两个问题:
(A)和(B)不同吗?
在(测试)中:str是否会不确定?它移到str2之后?
最佳答案
std::move
以(非常量)右值引用作为参数。因此,无论是否有右值,您都不能将其直接绑定到const
任何东西。因此,在(A)和(B)中,当您调用std::move
时,它将创建一个未命名的临时副本并将其移动。
结果,str
永远不会移动,也不会受到任何影响。
要在不复制的情况下摆脱const
,您需要一个明确的const_cast
。如果这样做,您将获得明显的未定义行为。