-
Каковы конкретные проблемы, которые следует избегать с ограничениями, налагаемыми этим предложением
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) {};
};