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
相关产品推荐
相关产品推荐

