建設安全な時にこれをダウンキャストされていますか?
-
19-09-2019 - |
質問
私は与えられたクラス(B)は常に第1(D)に由来することを知っているクラス階層を有しています。 Bのコンストラクタでは、私は誰も全体の工事が終了する前にそれを使用しようとしないだろうことを確信している場合、静的Dの*にthis
ポインタをキャストすることは安全ですか?私の場合、私はまだ別のクラス(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
{};
このコードは安全ですか?
解決 3
@ AProgrammerの答えには、私はstatic_cast
ことに気づい作ら簡単基底クラスに派生クラスからthis
ポインタを渡すことによって回避することができます。したがって、質問はメンバー初期化子リストにthis
ポインタの有効性に帰着ます。
私はC ++標準で次の音符を発見[12.6.2.7]:
注: MEM-イニシャライザがコンストラクタの範囲で評価されているので、
this
ポインタ/ <式リストで使用することができますem>ののMEM-初期化子のの、初期化されているオブジェクトを参照します。
このため、メンバー初期化子リストでthis
を使用することは完全に有効であるので、私は提示されたコードは、安全な(限りDのいかなるメンバーがアクセスされないように)だと思います。
他のヒント
私はそれについては何も見つかりませんでした。私は、これは安全ですが、あなたのコードは安全ではないと思われる理由を見つけるために、トラブルをしました。
struct B
{
A a;
B(D& d) : a(d) {}
};
struct D : public B
{
D() : B(*this) {}
};
が、私はおそらくまだ私はここに現在の形を使用すると思います。
いいえ、そうではありません。 D'sのデータメンバのコンストラクタは、まだ実行されませんでした。
D'S membrsが構築されていないので、は、Dは、まだ完全に構築されていないので、技術的には、Dへの参照は無効であるべきです。私はそれはまだほとんどの実装上の問題はないが、それに期待しています。
私はより良いメカニズムを提案したいのですが、私は「より良い」と思い、実際の内容に大きく依存します。