MSVC下嵌套聚合体成员初始化异常?已提交编译器Bug报告
嵌套聚合初始化的异常问题(MSVC)
鉴于此问题疑似编译器Bug,我已向微软提交了相关报告。
以下代码的输出不符合预期。我原本认为Inner的num1会被初始化为10(实际确实如此),num2会复制num1的10完成初始化,输出应为10 10,但实际输出是10 4。
#include <iostream> struct Inner { uint64_t num1{10}; uint64_t num2{num1}; }; struct Outer { uint64_t a{}; Inner inner{}; }; Outer makeOuter() { return {.a = 4}; } int main(int argc, char* argv[]) { auto outer = makeOuter(); std::cout << outer.inner.num1 << " " << outer.inner.num2 << std::endl; return 0; }
num2似乎读取了未初始化的内存(或错误地址的值),它总是获取Outer成员a的值——无论a设为4还是0xFFFFFFFFFFFFFFFF都是如此。
使用的编译器为MSVC 19.37.32825.0,编译命令:cl main.cpp /std:c++latest /EHsc /O2 /link /out:program.exe
用clang或g编译可得到预期结果10 10。这是编译器Bug还是我的理解有误?
其他测试结果
- 为
Inner添加构造函数Inner() {}→ 输出变为10 10 - 将
Inner inner{}改为Inner inner{11, 12}→ 输出变为11 12(符合预期) - 将
Inner inner{}改为Inner inner{11}→ 输出变为11 4 - 返回
{}而非{.a = 4}→ 输出变为10 10 - 在main中直接创建
Inner inner{}并打印成员 → 输出变为10 10
内容的提问来源于stack exchange,提问作者Adam King
相关产品推荐
相关产品推荐

