本条款所施加的限制避免了哪些具体问题
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 类对象的指针(泛左值)转换为指向 X 的直接或间接基类 B 的指针(引用),X 的构造及其所有直接或间接基类的构造从 B 直接或间接派生的那些应该已经开始并且这些类的销毁应该没有完成,否则转换会导致未定义的行为。
是否正确地说X
上面提到的所有直接和间接基础的集合不包括B
,因此下面的代码定义良好,尽管事实上它Base
是的直接基础Derived
并且尚未开始?
struct Base{ Base(Base*); };
struct Derived : Base {
Derived() : Base(this) {};
};