我理解,对于非静态成员变量,初始化列表中的评估顺序是根据类中声明的顺序。
请考虑以下来自isocpp的示例
class Z { public: Z() throw(); protected: X x_; Y y_; }; Z::Z() throw() : y_(), x_(y_) {}
在 Z ,你宣布 x_ 之前 y_ 。因此, x 以前是建造的 y_ 无论初始化程序的顺序如何。
Z
x_
y_
x
并且,初始化 x_(y_) 之前 y_ 构造产生未定义的行为。
x_(y_)
我期望上面的程序给出seg错误
未定义的行为未定义。你不应该特别期待任何事情。
我期望上面的程序给出seg错误,但下面是我的o / p。
理论上,您的代码受到未定义的行为的影响。
已为该对象分配空间但尚未初始化。这些对象和指向这些对象的指针可以以有限的方式使用,但是在这样的对象上调用非静态成员函数是导致未定义的行为的原因。
从 https://timsong-cpp.github.io/cppwp/n3337/basic.life#5 :
如果出现以下情况,该程 (5.1) 对象将是或具有非平凡析构函数的类类型,并且指针用作delete-expression的操作数, (5.2) 指针用于访问非静态数据成员或调用对象的非静态成员函数,或
如果出现以下情况,该程
(5.1) 对象将是或具有非平凡析构函数的类类型,并且指针用作delete-expression的操作数,
(5.2) 指针用于访问非静态数据成员或调用对象的非静态成员函数,或
你没有看到任何不良行为的最可能原因是 Y 没有任何成员变量。如果您添加成员变量 Y 并使用它 Y:f() ,你很可能会更容易注意到这个问题。
Y
Y:f()