Стандарт не запрещает его использование в [basic.start.main], и, хотя и заставляет все реализации поддерживать как минимум int main() {/*...*/ }
и int main(int argc, char* argv[]) {/*...*/}
, не ограничивает реализации этими двумя объявлениями (3.6.1,пункт 2).
Из этого, по отдельности, может показаться, что по крайней мере это законно, хотя, конечно, это относится только к объявлениям функций, а не к определениям функций.
Чтениев [исключении. дескриптор] параграфа 13 говорится следующее:
Исключения, возникающие в деструкторах объектов со статической продолжительностью хранения или в конструкторах объектов пространства имен, не перехватываются функцией-попыткойблок на главной ().(15.3, пункт 13)
В нем конкретно упоминается function-try-block , помещенный в main()
, что настоятельно подразумевает, что такая структура является законной и определилаповедение.Добавление в информацию о том, что main()
является особенным только по имени и типу возвращаемого значения и что реализации могут не перегружать его для изменения какого-либо поведения, дает достаточно веский аргумент в пользу того, что он действует обычным образом, за исключением случаев, когда это специально отмечено, например, ввыше цитата.Другими словами, да, это законно и четко определено.
Сообщение в блоге, которое я представил в первой версии этого ответа, на самом деле хорошо иллюстрирует правила, заданныеприведенная выше цитата, так что я сохраню ссылку на нее , даже если она не обсуждает напрямую проблему в вопросе OP.
Что касается комментария к OP, вы можете выдать returnоператоры в function-try-block , и [exc.handle] имеет это, чтобы сказать:
Пропускание конца функционального try-блока эквивалентновернуть без значения;это приводит к неопределенному поведению в функции, возвращающей значение (6.6.3).(15.3, пункт 15)
Если вы находитесь в блоке catch в конце main
, вы не собираетесь перетекать через тело функции (что будетв этом случае), поэтому правило, которое main автоматически вызывает return 0;
при передаче, не применяется.Вам нужно вернуть немного int
(вполне возможно, код ошибки), чтобы не стать неопределенным.