Ответ 1
В случае exit( 0 )
вы вызываете функцию. Вы
не ожидайте вызова деструкторов локальных переменных, если
вы вызываете функцию. И компилятор не знает,
a priori, что есть что-то особенное в exit( 0 )
.
Фактически, это обоснование действительно применимо только к С++ до
исключения. Стандарт может переопределить exit()
, чтобы
исключение реализации с аргументом и указать
что вызов main
завернут в блок try, который ловит
это исключение, и возвращает код возврата обратно в систему.
Это означало бы, что exit
имеет совершенно другую
семантика в C и на С++; во всяком случае, не было
предложение перед комитетом внести это изменение.