この条項によって課せられた制限によって回避されている具体的な問題は何ですか
12.7p3
(以下の段落の最初の部分を参照)?12.7p3
(以下を参照)に示されている例では、なぜX(this)
が定義されていると見なされるのですか?X
パスにないからE C D B A
ですか?struct A { }; struct B : virtual A { }; struct C : B { }; struct D : virtual A { D(A*); }; struct X { X(A*); }; struct E : C, D, X { E() : D(this), // undefined: upcast from E* to A* // might use path E* - D* - A* // but D is not constructed // D((C*)this), // defined: // E* - C* defined because E() has started // and C* - A* defined because // C fully constructed X(this) { // defined: upon construction of X, // C/B/D/A sublattice is fully constructed } };
以下の段落の先頭を見つけてください
12.7p3
。
クラス X のオブジェクトを参照するポインタ (glvalue) を、X の直接的または間接的な基底クラス B へのポインタ (参照) に明示的または暗黙的に変換するには、X の構築と、その直接的または間接的な基底のすべての構築B から直接的または間接的に派生するクラスが開始され、これらのクラスの破棄が完了していない必要があります。そうでない場合、変換によって未定義の動作が発生します。
X
上記の のすべての直接ベースと間接ベースのセットには が含まれないというのは正しいでしょうか。このため、がの直接ベースであり、まだ開始されていないB
という事実にもかかわらず、以下のコードは明確に定義されています。Base
Derived
struct Base{ Base(Base*); };
struct Derived : Base {
Derived() : Base(this) {};
};