在构造 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
考虑创建对象时发生的情况。首先分配内存,然后调用构造函数。因此“还没有地址”是不正确的。
以下是一些代码的简化版本。
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
考虑创建对象时发生的情况。首先分配内存,然后调用构造函数。因此“还没有地址”是不正确的。