2

多次简化代码后,我发现问题的原因如下。

class B {
public:
    B(const int x)
              :_x(x) {}
    const int _x;
};

class C {
public:
    C(const B& b) 
        : _b(b), _b2(_b._x) {}
    B _b2;       // line 1
    const B& _b; // line 2
};

int main() {
    B b(1);
    C c(b);
}

警告(clang 8.0.0)

test16.cpp:11:22: warning: reference '_b' is not yet bound to a value when used here [-Wuninitialized]
        : _b(b), _b2(_b._x) {}
                     ^
1 warning generated.

g++-6 编译程序。运行程序会导致分段错误。

类成员的初始化是按照成员初始化列表的顺序(: _b(b), _b2(_b._x))还是类中成员的顺序(如B _b2; const B& _b;)?

4

2 回答 2

6

成员变量的初始化按照它们在类中声明的顺序进行。

http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-order

和:

http://en.cppreference.com/w/cpp/language/initializer_list

3) 然后,按照类定义中的声明顺序初始化非静态数据成员。

于 2017-01-27T03:27:25.493 回答
3

您在成员初始化器列表中指定的顺序无关紧要,非静态成员按照类定义中的声明顺序进行初始化。

列表中成员初始化器的顺序无关紧要:实际初始化顺序如下:

3) 然后,按照类定义中的声明顺序初始化非静态数据成员。

这意味着_b2将始终在之前初始化_b;并且什么时候_b用于初始化_b2它仍然没有初始化。

BTW:类似的规则适用于直接基类的初始化。

2) 然后,直接基类按照从左到右的顺序初始化,因为它们出现在此类的基说明符列表中

于 2017-01-27T03:28:43.127 回答