多次简化我的代码后,我发现以下原因造成了问题。
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);
}
警告(铿锵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;
)?
答案 0 :(得分:4)
成员变量的初始化按它们在类中声明的顺序发生。
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-order
和
http://en.cppreference.com/w/cpp/language/initializer_list
3)然后,按照以下顺序初始化非静态数据成员 类定义中的声明。
答案 1 :(得分:3)
您在member initializer list中指定的顺序无关紧要,非静态成员按照类定义中的声明顺序进行初始化。
列表中成员初始值设定项的顺序无关紧要:初始化的实际顺序如下:
3)然后,按照类定义中的声明顺序初始化非静态数据成员。
这意味着_b2
将始终在_b
之前初始化;当_b
用于初始化_b2
时,它仍未初始化。
BTW:类似的规则适用于直接基类的初始化。
2)然后,直接基类按从左到右的顺序初始化,因为它们出现在这个类的基本说明符列表中