上面突出显示的文本似乎为以下代码段提供了支持:

#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/

10-13 06:59