在构造 UB 期间是否将引用从子项传递给父项?

Is Passing Reference From Child To Parent During Construction UB?

以下是一些代码的简化版本。

struct Test {
    Test( int &id ) : id( id ) {}
    int &id;
};

struct B : Test {
    B() : Test( a ) {}
    int a;
};

现在,我知道在创建 B 对象时,父对象(在本例中为 Test 将在 B 对象之前创建。这是否意味着传递给 Test 构造函数的 a 变量还没有地址,因此是未定义行为?或者这样安全吗?

澄清一下,id 的值 B 完全构建之前不会使用

是的,你的代码没问题。

您可以在构造函数中使用内存地址和引用尚未初始化的成员。您不能做的是在初始化之前使用该值。这将是未定义的行为:

struct BROKEN {
    BROKEN( int* id ) : id(*id) {}
    int id;               // ^ -------- UB
};

struct B : BROKEN {
    B() : BROKEN( &a ) {}
    int a;
};

[...] being passed in to the Test constructor, does not yet have an address and is thus Undefined Behaviour

考虑创建对象时发生的情况。首先分配内存,然后调用构造函数。因此“还没有地址”是不正确的。