我正在阅读N3797的第12.7条。给出以下示例:

struct X { int i; };
struct Y : X { Y(); };  // non-trivial
struct A { int a; };
struct B : public A { int j; Y y; }; // non-trivial

extern B bobj;
B* pb = &bobj; //1
int* p1 = &bobj.a; //2 undefined, refers to base class member
int* p2 = &bobj.y.i; //3 undefined, refers to member’s member
A* pa = &bobj;
B bobj;
extern X xobj;
int* p3 = &xobj.i;
X xobj;

此示例必须反射(reflect)以下规则:



但是我有一个疑问。如果实现未以静态方式对//1//2//3执行动态初始化,则在//2//3上我们没有未定义的行为,因为(3.6.2/1):



也就是说,我们在非静态和基数之前调用了该构造函数。因此,该示例的结果是实现的定义。

我的推理正确吗?

最佳答案

“它也可以调用constexpr构造函数”,Y::Y()不是constexpr构造函数,因此B bobj属于动态初始化。

关于c++ - 了解类对象的构造,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25470791/

10-11 19:31