Понимание процесса строительства стартового объекта и UB

Следующий пример приведен в 12.7 / 3 N3797

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
}
};

Правило для примера:

Чтобы явно или неявно преобразовать указатель (glvalue), ссылающийся на
объект класса X на указатель (ссылку) на прямой или косвенный
Базовый класс B X, строительство X и строительство всех
его прямых или косвенных оснований, которые прямо или косвенно вытекают
из B должно начаться и уничтожение этих классов
не завершено, в противном случае преобразование приводит к неопределенному
поведение.

Но рассмотрим небольшую модификацию примера:

struct A { };
struct HD { }; // will be used as a base for D
struct B : virtual A { };
struct C : B { };
struct D : HD, virtual A { D(A*); };
struct X { X(A*); };
struct E : C, D, X {
E() : D(this), // 1. Is there undefined behavior?
// I think, there isn't.
X(this) {
}
};

Я думаю //1 не имеет UB, потому что у нас есть базовый подобъект класса HD который был построен до вызова D(A*) конструктор. То есть во время вызова D (A *) конструкция D началось.

Правильно ли мое рассуждение?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]