将右值引用传递给右值引用参数时出错

Error occurred when passing r-value reference to r-value reference parameter

我有密码

void print(string &&str) {
   cout << str << endl;
}
int main() {
   string tmp("Hello");
   string&& str = move(tmp);
   //print(move(str));
   print(str);
   return 0;
}

编译后得到error: cannot bind rvalue reference of type 'std::__cxx11::string&&' to lvalue of type 'std::__cxx11::string'.

但是 str 是对 r 值 的右值引用(不是吗?),所以将它传递给 print 是有意义的相信。为什么会出现这个错误?

您混淆了 value categories 和类型。

(强调我的)

lvalue

The following expressions are lvalue expressions:

  • the name of a variable or a function in scope, regardless of type, such as std::cin or std::endl. Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression;
  • ...

str的类型是右值引用(到string),但作为命名变量它是一个左值,不能绑定到右值引用。

如果允许,请考虑以下情况:

string tmp("Hello");
string&& str = move(tmp);
print(str);               // str might be moved here

cout << str << endl;      // dangerous; str's state is undeterminate

因此,如果您确定效果,则需要显式使用 std::move (将 str 转换为 xvalue)。