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

