将r值引用传递给r值引用参数时发生错误

时间:2017-03-30 10:23:06

标签: c++ c++11 pass-by-reference rvalue-reference rvalue

我有代码

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-value 的r值参考(isn&#39;它?),因此将其传递到print是有道理的。为什么会出现此错误?

1 个答案:

答案 0 :(得分:4)

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

(强调我的)

  

左值

     

以下表达式是左值表达式:

     
      
  • 范围内的变量或函数的名称,,无论类型,例如std :: cin或std :: endl。 即使变量的类型是rvalue   引用,由其名称组成的表达式是左值   表达
  •   
  • ...
  •   

str的类型是rvalue-reference(到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)。