0

我有一个类层次结构,我知道给定的类 (B) 将始终派生为第二个 (D)。this在 B 的构造函数中,如果我确定在整个构造完成之前没有人会尝试使用它,那么将指针静态转换为 D* 是否安全?就我而言,我想将对对象的引用传递给另一个类 (A)。

struct A
{
    D & d_;

    A(D & d) : d_(d) {}
};

struct D; //forward declaration

struct B
{
    A a;

    B() : a(std::static_cast<D&>(*this)) {}
};

struct D : public B
{};

这段代码安全吗?

4

3 回答 3

2

不它不是。D 的数据成员的构造函数尚未运行。

由于 D 的成员尚未构建,因此 D 尚未完全构建,因此从技术上讲,对 D 的引用应该是无效的。我希望这在大多数实现上都没有问题,但仍然如此。

我想提出一个更好的机制,但我想“更好”很大程度上取决于实际细节。

于 2009-07-28T10:08:41.667 回答
2

我没有找到任何相关的信息。我很难找到您的代码在安全的情况下不安全的原因:

struct B
{
    A a;

    B(D& d) : a(d) {}
};

struct D : public B
{
    D() : B(*this) {}
};

但我可能仍会使用我在这里提供的表格。

于 2009-07-28T10:30:59.687 回答
0

@AProgrammer 的回答让我意识到static_cast可以通过将this指针从派生类传递给基类来轻松避免。因此,问题归结为this指向成员初始化器列表的指针的有效性。

我在 C++ 标准 [12.6.2.7] 中找到了以下注释:

[注意:因为mem-initializer是在构造函数的范围内计算的,所以可以在mem-initializer的表达式列表this使用指针来引用正在初始化的对象。]

因此,this在 member-initializer-list 中使用是完全有效的,所以我认为呈现的代码是安全的(只要不访问 D 的成员)。

于 2009-07-28T12:10:53.667 回答