C++存储局部变量const引用地址是否属于未定义行为?
问题结论
你的简化代码写法完全符合C++标准,不存在未定义行为。
合法性说明
serializeStruct的按值传递参数value的生命周期覆盖整个函数作用域,从函数入口生效,直到函数返回前才会销毁。- 你调用
createView获取value的地址存储在VariableView中,之后在同一个函数作用域内将该视图传给serializeGeneric使用,整个指针访问过程value都处于存活状态,操作完全合法。
现象原因说明
你观察到的/O2优化等级下value内容被提前覆盖的情况,属于MSVC编译器的优化bug:编译器在做别名分析时错误判定createView调用后value不再被使用,因此提前复用了它的栈内存空间。
你后续缩小问题范围的过程也符合这类编译器bug的典型特征:
- 仅高优化等级触发,降低到
/O1及以下问题消失 - 等效代码调整(比如将type trait替换为实际解析到的类型)即可让问题消失,不存在代码逻辑层面的错误
内容的提问来源于stack exchange,提问作者Juliean
相关产品推荐
相关产品推荐

