上面突出显示的文本似乎为以下代码段提供了支持:
#include<iostream>
struct A{
int i = j + 1;
int j = 1;
};
int main(){
A a;
std::cout << a.i << '\n';
std::cout << a.j << '\n';
}
,并且我希望它能打印出来
2
1
GCC和clang都打印
1
1
但另外clang会发出以下警告:
prog.cc:3:13: warning: field 'j' is uninitialized when used here [-Wuninitialized]
int i = j + 1;
^
prog.cc:8:7: note: in implicit default constructor for 'A' first required here
A a;
^
prog.cc:2:8: note: during field initialization in the implicit default constructor
struct A{
^
1 warning generated.
我的假设是该代码是格式错误的NDR。但为什么?
最佳答案
由于[class.base.init]/9,您的代码具有未定义的行为
因此,这意味着
struct A{
int i = j + 1;
int j = 1;
};
被翻译成
struct A{
A() : i(j + 1), j(1) {}
int i;
int j;
};
并且因为
i
首先被初始化,所以它使用了一个未初始化的变量,并且是未定义的行为。关于c++ - 我的假设是以下格式错误的NDR?但为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55009366/