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

C++中返回const引用的decltype(auto)相关代码异常问题咨询

聊聊这段C++测试代码的诡异输出

先来看测试代码:

#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T>
decltype(auto) foo(T& arg) {
    return arg;
}
int main() {
    const int x = 10;
    int & y = const_cast<int&>(foo(x));
    y = 20;
    cout << "x: " << &x << " " << x << endl;
    cout << "y: " << &y << " " << y << endl;
}

编译运行的命令是:
g++ -std=c++17 main.cpp && ./a.out

运行后输出大概是这样(内存地址会因运行环境不同而变化):

x: 0x7ffee31f4a6c 10
y: 0x7ffee31f4a6c 20

是不是觉得特别奇怪?明明x和y指向的是同一个内存地址,修改y之后,x的输出居然还是10?其实这是编译器的常量折叠优化在搞事情。

这里的核心点在于:const int x = 10是一个编译期常量,编译器会把代码里所有用到x的地方直接替换成字面量10,根本不会每次都去内存里读取实际值。哪怕你用const_cast强制去掉了x的const属性,通过引用修改了内存里的实际数据,但当你输出x的时候,编译器直接用了预先折叠好的10,完全没管内存里的变化。而y是非常量引用,编译器不会对它做这种优化,所以它输出的是内存里实际被修改后的20。

不过要特别提醒:这种修改const变量的操作属于C++里的未定义行为,标准没有规定编译器要怎么处理,换个编译器或者调整编译选项,结果可能就不一样了,实际开发里可千万别这么写哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:12:40