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

关于《C++ Primer》中const引用代码示例的疑问

const引用绑定字面值与临时对象的问题解析

核心逻辑:临时对象的隐式创建与生命周期延长

C++中引用确实需要绑定到可寻址的对象(左值),但针对const T&类型的常量引用,编译器会做特殊处理:当你将其绑定到字面值(如42)或表达式计算结果(如r1*2)时,编译器会自动创建一个临时的const T类型对象,将字面值/表达式结果存入其中,再让引用绑定到这个临时对象上。同时,临时对象的生命周期会被延长至与该常量引用一致,避免悬空引用问题。

逐行代码解释

  • int i = 42;:定义普通int变量i,赋值为42
  • const int &r1 = i;:合法操作,常量引用可以绑定到普通int对象。这相当于给i添加了一层只读限制——通过r1无法修改i的值,但i本身仍可被直接修改。
  • const int &r2 = 42;:编译器自动创建临时const int对象存储42,r2绑定到该临时对象。因为r2是常量引用,临时对象生命周期被延长,所以操作合法。
  • const int &r3 = r1 * 2;:r1*2计算得到临时值84,编译器创建临时const int对象存储该结果,r3绑定到这个临时对象。注释“ok: r3 is a reference to const”的意思是:该操作合法,因为r3是常量引用,允许绑定临时对象。
  • int &r4 = r1 * 2;:报错原因是普通非const引用要求绑定可修改的左值,而表达式结果是不可修改的临时右值,两者类型不匹配,因此编译器禁止该操作。

关键区别:const引用与普通引用的绑定规则

  • 普通int&:只能绑定到可修改的左值(比如普通变量),无法绑定字面值、临时值等右值,因为它允许通过引用修改绑定对象,而临时对象不可被修改。
  • const int&:可以绑定左值、字面值、临时值等,因为它是只读引用,不会尝试修改绑定对象,编译器因此允许隐式创建临时对象并延长其生命周期。

内容的提问来源于stack exchange,提问作者Yun-Ting Chiu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:18:37