This question already has answers here:
Passing int&& to f(int&&)

(3个答案)


3年前关闭。




我有代码
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值的r值引用(不是吗?),所以我相信将其传递给print是合理的。为什么会发生此错误?

最佳答案

您对value categories和类型感到困惑。

(强调我的)


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

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

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)。

10-06 03:04