为何返回左值引用的函数无法返回具名右值引用?
问题:具名右值引用返回时的编译差异
在C++中,具名右值引用属于左值,但为何以下代码会报错error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'?
int & unmove(int && t) { return t; }
而以下代码可以正常运行:
int & unmove(int && t) { int & r = t; return r; }
原因解析
这是因为C++对return语句中的右值引用参数有特殊规则:
- 当直接返回函数参数的具名右值引用
t时,编译器会把它识别为将亡值(xvalue)——这属于右值范畴。此时试图把这个右值绑定到返回类型int&(非const左值引用)上,就违反了“非const左值引用不能绑定右值”的规则,触发编译错误。 - 先把
t绑定到左值引用r之后,r是明确的左值。返回r时,编译器直接按左值处理,完全符合int&的返回要求,因此可以正常编译。
简单来说:直接返回右值引用参数时,编译器会“降级”它的属性为右值;通过左值引用中转后,就保留了左值属性,满足返回类型的要求。
内容的提问来源于stack exchange,提问作者zwhconst
相关产品推荐
相关产品推荐

