-
Каковы конкретные проблемы, которые следует избегать с ограничениями, налагаемыми этим предложением
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:
Чтобы явно или неявно преобразовать указатель (glvalue), ссылающийся на объект класса X с указателем (ссылкой) на прямой или косвенный базовый класс B из X, построение X и построение всех его прямых или косвенных оснований, которые прямо или косвенно получают от B, и уничтожение этих классов должно не завершены, в противном случае результат преобразования в undefinedповедение.
Можно ли сказать, что множество всех прямых и косвенных оснований X, упомянутых выше, не включает B, и из-за этого код ниже хорошо определен, несмотря на то, что Base является прямой базой Derived и еще не началось?
struct Base{ Base(Base*); };
struct Derived : Base {
Derived() : Base(this) {};
};