我有代码
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
是有道理的。为什么会出现此错误?
答案 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)。