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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:27:07