Вывод будет A, B, ~A, caught. Поле a успело построиться и уничтожается при раскрутке стека. Объекты b и C не завершили создание, их деструкторы не вызываются.
Какие деструкторы вызываются при ошибке конструктора?
Вывод будет A, B, ~A, caught. Поле a успело построиться и уничтожается при раскрутке стека. Объекты b и C не завершили создание, их деструкторы не вызываются.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В C++ класс C содержит поля A a; B b; в таком порядке. Конструктор A печатает A. Конструктор B печатает B и бросает std::runtime_error. Тело конструктора C печатает C. Деструкторы печатают ~A, ~B, ~C. Создание локального C находится внутри try, catch печатает caught. Каков вывод?
Ответ
Вывод будет A, B, ~A, caught. Поле a успело построиться и уничтожается при раскрутке стека. Объекты b и C не завершили создание, их деструкторы не вызываются.
Тело конструктора C вообще не начнёт выполняться: инициализация поля b завершилась исключением. Уже завершённые подобъекты автоматически уничтожаются в обратном порядке. Ресурс, захваченный внутри B до исключения, должен находиться под управлением RAII-поля или локального объекта: рассчитывать на вызов ~B в этой ситуации нельзя. В условии рассматривается обычный, не делегирующий конструктор.
Источник: eel.is.