左值引用能否绑定到右值引用?代码实例疑问解析
C++右值引用变量绑定左值引用的疑问
代码片段
int main() { int&& a = 2; int& b = a; // (*) }
问题描述
我知道a是类型为“int右值引用”的左值表达式,b是类型为“int左值引用”的普通变量。但b的初始化语句(*)看起来不符合预期,因为a的类型并非int,似乎无法匹配b的引用类型。请问该如何解释这一结果?初始化过程中是否发生了隐式转换?或是我遗漏了相关概念或关键字?
解答
核心要点是具名的右值引用本身是左值,这是C++中容易混淆的关键规则:
- 声明
int&& a = 2;时,a的类型确实是int&&(右值引用),但在表达式中使用这个具名变量时,它的值类别是左值——C++标准明确规定,所有具名的引用(无论左值还是右值引用类型)都属于左值。 - 初始化左值引用
int& b时,要求初始化表达式是可修改的左值。a作为具名右值引用,绑定的是一个被延长生命周期的临时int对象(2被物化后的临时对象),它本身是可修改的左值,因此b可以直接绑定到a所引用的同一个int对象上,不需要任何隐式转换。 - 这里必须区分两个独立概念:“引用的类型”和“表达式的值类别”。
a的类型是右值引用,但它作为表达式的值类别是左值,完全满足左值引用的初始化要求。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

