以下是安全的吗?

时间:2011-12-31 06:32:35

标签: c++ inheritance undefined-behavior

考虑以下代码:

struct A {};

struct B
{
    B(A* a) : a(a) {}
private:
    A* a;
};

struct base
{
    base(B b) : b(b) {}
protected:
    A a;
private:
    B b;
};

struct derived : public base
{
    derived() : base(B(&a)) // <-- IS THIS OK?
    {}
};

这里,基类需要一个由派生类传递给它的构造函数的B对象,而B对象引用一个A对象,但是A对象存在于基类中。

B对象的构造函数除了存储它之外没有对A指针做任何事情,所以我认为这应该没问题,但它仍然感觉不对,因为技术上A对象在我没有存在的时候将它传递给基础构造函数。

我可以在这方面遇到麻烦,还是应该这样做?

2 个答案:

答案 0 :(得分:4)

a尚未构建,但它确实有一个地址,此时获取其地址是合法的。但是,您确实需要确保不在B的构造函数中使用指针(即,不要取消引用指针)。

但这一切都很尴尬。

答案 1 :(得分:4)

只要您不在a的构造函数中使用 B,它就是安全的,因为对象a尚未构建。

我的意思是,你不应该取消引用a构造函数中的指针B's;但是,在base的构造函数执行后,您可以在B::a的其他方法中安全地取消引用B