(A)
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);
两个问题:
答案 0 :(得分:2)
答案 1 :(得分:2)
std::move
将(非常量)右值引用作为参数。因此,您无法将其直接绑定到const
任何内容,无论是否为rvalue。因此,在(A)和(B)中,当您调用std::move
时,它会生成一个未命名的临时副本并移动它。
因此,str
永远不会被移动,并且永远不会受到任何影响。
要在不复制的情况下摆脱const
,您需要一个明确的const_cast
。如果你这样做了,你就会得到明显的未定义行为。
答案 2 :(得分:-1)
使用给定的测试代码,案例不同,因为A
无法编译而B
编译。
如果A
,右值引用无法绑定到左值。
如果B
函数返回字符串的副本。将std::move
与const引用一起使用仍然会产生一个const引用。