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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:32:52