将右值引用传递给右值引用参数时出错
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)。
我有密码
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)。