C++中使用const引用绑定右值时实际指向哪个内存地址?
解答
你代码中取到的&number对应的地址,是编译器为适配const左值引用绑定规则,隐式创建的临时int对象的栈内存地址,并非字面量10本身的地址。
核心规则和逻辑如下:
- C++中整数字面量
10属于纯右值,本身没有独立的可寻址用户态内存空间,通常会被直接编译为指令中的立即数存放在代码段,无法直接通过取址操作拿到地址。 - 按照C标准规定,当使用
const T&类型的const左值引用(C11及之后版本的T&&右值引用同理)绑定一个纯右值时,编译器必须隐式生成一个类型为T的临时对象,用绑定的右值完成该临时对象的初始化,再让引用指向这个临时对象。同时该临时对象的生命周期会被延长,和当前引用的生命周期保持一致,不会在绑定表达式结束后立刻销毁。
你给出的示例代码中,const int& number=10;这一行,编译器实际生成的运行逻辑等价于如下手写代码:
// 编译器隐式生成的匿名临时变量,代码中无对应变量名 int __anonymous_temp = 10; const int& number = __anonymous_temp;
后续执行&number取到的,就是这个匿名临时变量的内存地址。由于这个临时变量分配在main函数的栈帧上,所以你输出的0x62ff08是典型的栈内存地址,和普通局部int变量的地址没有本质区别,该地址存储的值为10,但这个栈上的临时变量和编译期的字面量10是完全独立的两个实体。
注意:这个临时对象生命周期延长规则存在明确边界,如果函数返回const引用绑定内部临时对象,临时对象的生命周期不会延长到函数作用域外,会直接产生悬垂引用,属于C++开发中的常见易错点。
另外非const的普通左值引用不支持绑定右值,比如直接写int& number = 10;会直接触发编译错误,不会触发上述临时对象生成逻辑。
内容的提问来源于stack exchange,提问作者tempdev nova
相关产品推荐
相关产品推荐

