You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

左值引用能否绑定到右值引用?代码实例疑问解析

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:55:18