我有一个类,它将一个数据成员的地址传递给另一个数据成员的构造函数:
class MemberA {
public:
MemberA(MemberB* ptr) : ptr_(ptr) {}
private:
MemberB* ptr_;
};
struct MemberB {
public:
MemberB(int x) : x_(x) {}
private:
int x_;
};
class Foo {
public:
Foo() : a(&b), b(1) {}
private:
MemberA a;
MemberB b;
};在本例中,a是在b之前构造的,但取决于b的地址。这个能行吗?我的直觉是,数据成员在开始时被分配,这样Foo就知道它需要有多大,也因为它们在堆栈上被分配。然而,我不知道这是一个事实,我想要核实。
顺便说一句,我知道翻转顺序将完全解决这个问题;如果b是在a之前声明和初始化的,那么我就知道它会工作。我还意识到,即使地址已知,在初始化b_之前取消引用也是未定义的行为。然而,我真的很好奇上面的场景是否合法
谢谢!
发布于 2021-05-19 22:21:12
数据成员在对象本身内分配。标准中没有指定其中的大部分内容,但大多数编译器是这样做的:
-- FOO --------------------------------------------
| --MemberA--- --MemberB--- |
| | | | | other stuff follows |
| ------------ ------------ |
---------------------------------------------------因此,在构造Foo F;时,在初始化它的b之前,它的地址已经相对于Foo F已知了。因此,b的地址可以传递给a的构造函数。不过,如果a在其构造过程中访问该地址,就会出现未定义的行为。但是,只是将地址存储在后面呢?那就可以了。
https://stackoverflow.com/questions/67611498
复制相似问题