更新:由于这似乎是一个编译器错误,我已向Microsoft 提交了一份报告。
以下代码的输出让我感到惊讶。我的期望是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
它接收的 member的值a
,无论该值是 4 还是 0xFFFFFFFFFFFFFFFF。
编译器是MSVC 19.37.32825.0。例如通过运行进行编译cl main.cpp /std:c++latest /EHsc /O2 /link /out:program.exe
。
使用 clang++ 或 g++,我得到了预期的结果10 10
。编译器错误还是我的误解?
其他一些变化的影响:
- 将构造函数添加
Inner() {}
到Inner
-> 输出变为10 10
- 更改
Inner inner{}
为Inner inner{11, 12}
-> 输出变为11 12
(预期) - 更改
Inner inner{}
为Inner inner{11}
-> 输出变为11 4
- 返回
{}
而不是{.a = 4}
-> 输出变成10 10
Inner inner{}
直接创建main
并打印其成员 -> 输出变为10 10
这是一个编译器错误。
makeOuter()
被翻译成如果它像这样改变
然后它被翻译成
https://godbolt.org/z/vdb4Yv6n8