C++中取整数字面量地址失败,const引用为何可行?
为什么Case 1编译失败而Case 2可以正常运行?
先看你的代码:
#include <iostream> using namespace std; int main() { // Case 1 cout << &5; // 该行编译失败,我理解这是因为"5"是右值 // Case 2 const int& ref = 5; cout << &ref; // 可正常运行,原因是什么? // Case 3 cout << &"SomeString"; // 可正常运行,我理解这是因为"SomeString"是左值 return 0; }
核心原因拆解
Case 1 编译失败的本质:
整数字面量5是纯右值(prvalue),C++标准明确禁止对纯右值取地址。纯右值是临时的、无持久存储实体的值,编译器不会为它分配固定内存空间,自然无法获取其地址。Case 2 能运行的关键机制:
当用const int&绑定到纯右值5时,C编译器会自动创建一个临时的const int对象,把5的值拷贝到这个临时对象里,再让引用ref绑定到这个临时对象上。
这个临时对象是左值(有明确的内存地址),所以&ref实际上取的是这个临时对象的地址,而非字面量5的地址。
同时C标准规定:用const左值引用绑定临时对象时,临时对象的生命周期会被延长至引用的生命周期结束(此例中就是main函数执行完毕前),因此可以安全地对其取地址并使用。Case 3 的补充说明:
字符串字面量"SomeString"本质是const char[N]类型的左值(N为字符串长度加1,包含终止符),它存储在程序的只读数据段中,本身就有固定内存地址,所以直接取地址合法,和Case2的临时对象机制完全不同。
内容的提问来源于stack exchange,提问作者Avi
相关产品推荐
相关产品推荐

