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

C++中取引用地址是否必返回底层对象地址?求标准依据

问题解答

核心结论

你提供的示例代码中的断言无条件成立,编译器绝对不能为优化目的创建a[0]的临时对象并让b引用该临时。

标准条款依据

1. 引用取地址的结果规则

根据C++标准(以ISO/IEC 14882:2020为例)[expr.unary.op]/3:

一元&运算符的结果是指向其操作数的指针。操作数应为左值或限定id。如果操作数是类型为T的左值,结果是类型为“指向T的指针”的纯右值,其值为指定对象或函数的地址。

引用的名字本身属于左值,且直接关联到被引用的底层对象。因此对b应用&运算符,得到的必然是a[0]的地址,不可能指向临时对象。

2. 左值引用的绑定规则

根据C++标准**[dcl.init.ref]/5.1**:

类型为“cv1 T1”的引用由类型为“cv2 T2”的表达式初始化时,若引用是左值引用且初始化表达式是左值,则引用直接绑定到初始化表达式的左值对象。

示例中g(a[0])调用时,a[0]是数组元素的左值,b作为左值引用会直接绑定到a[0]本身,编译器没有任何权限创建临时对象来中转这个引用绑定。

3. 数组指针的算术规则

根据C++标准**[expr.add]/4**:

当整数类型的表达式J与指针类型的表达式P相加或相减时,结果类型为P的类型。若P指向具有n个元素的数组对象的一个元素,表达式P + J(其中J的值为j)指向距P所指元素j个位置的元素,前提是0 ≤ j ≤ n;否则行为未定义。

因为&b就是&a[0](指向数组a的第一个元素),所以&b + 1必然指向数组的下一个元素a[1],断言的比较结果恒为真。

内容的提问来源于stack exchange,提问作者Jonno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:00:18