#новичкам
Вопрос, который часто задают на собеседованиях, но боюсь, что мало кто понимает правильный ответ.
Значит единственный адекватный ответ - вызовется std::terminate. И здесь даже не нужно упоминать никаких double exception. То есть:
struct Class {
~Class() {throw 1;}
};
int main() {
try {
{Class cl;}
} catch(...) {
std::cout << "caught exception" << std::endl;
}
}В этом случае исключение не поймается, а просто вызовется std::terminate. И точка. Никаких дополнений.
Первое надо понимать, что все деструкторы неявно компилятором помечены, как noexcept. То есть не предполагается, что он выбрасывает исключения.
Если вы определяете деструктор дефолтным, то он noexcept. И даже если вы определяете кастомный деструктор, но не указываете ему политику исключений, он все равно помечен noexcept.
Однако мы можем сделать деструктор бросающим. Мы должны явно прописывать политику исключений:
struct Class {
// HERE
~Class() noexcept(false) {throw 1;}
};
int main() {
try {
{Class cl;}
} catch(...) {
std::cout << "caught exception" << std::endl;
}
}Только в этом случае на консоли появится
caught exception.И вот здесь уже можно говорить, что будет при раскрутке стека, втором исключении и прочем. Можете сами проверить на годболте.
Пока вы явно не пометили деструктор бросающим, при вылете исключения из деструктор будет вызван std::terminate.
Be explicit in your intentions. Stay cool.
#cppcore #cpp11 #interview