Будет ли работать автоматический вывод возвращаемого типа для main?

Смогу ли я сделать следующее для основной функции в С++ 1y (С++ 14):

auto main()
{
    // ...
}

Так будет ли возвращаемый тип автоматически int, даже если нам не нужно использовать явный return 0;?


person template boy    schedule 16.06.2013    source источник
comment
Это не практическая проблема, с которой вы на самом деле сталкиваетесь, или нет?   -  person Daniel Fischer    schedule 16.06.2013
comment
@DanielFischer Кого это волнует? Это интересный (бесполезный) пограничный случай.   -  person David    schedule 16.06.2013
comment
Я не знаю, было ли это в правилах особым случаем, но если нет, ожидайте void.   -  person Puppy    schedule 16.06.2013
comment
Почему? auto на одну букву длиннее int.   -  person milleniumbug    schedule 16.06.2013
comment
@ Дэйв, я не знаю. Мне просто интересно, почему возник вопрос.   -  person Daniel Fischer    schedule 16.06.2013
comment
Автор компилятора должен написать для этого специальное правило. Зачем им это делать?   -  person David Heffernan    schedule 16.06.2013
comment
@DavidHeffernan, им все равно пришлось написать специальное правило для неявного return 0;.   -  person Bartek Banachewicz    schedule 16.06.2013
comment
@BartekBanachewicz Бьюсь об заклад, разработчики стандартов не написали бы это сейчас, если бы могли начать все сначала   -  person David Heffernan    schedule 16.06.2013
comment
@DavidHeffernan: Бьюсь об заклад, они будут, так как это довольно недавнее дополнение (я полагаю). Но держу пари, если бы они учитывали этот момент, они бы просто запретили использование auto в качестве возвращаемого типа main().   -  person Ben Voigt    schedule 16.06.2013
comment
Я удалил ваш тег C++14. Этот мета-вопрос пришел к консенсусу, чтобы дождаться выпуска окончательного проекта стандарта, прежде чем использовать его вместо него. C++1г.   -  person chris    schedule 25.06.2013
comment
Как насчет просто auto { ... }. Очевидно, я хочу, чтобы здесь была функция запуска; автоматически вывести декларацию! :)   -  person Kaz    schedule 10.06.2014


Ответы (1)


Нет, не допустят. Параграф 7.1.6.4/10 стандартного проекта C++14 N3690 определяет:

Если функция с объявленным типом возвращаемого значения, использующая тип-заполнитель, не имеет операторов return, тип возвращаемого значения выводится как из оператора return без операнда в закрывающей фигурной скобке тела функции. [...]

Это означает, что пропуск оператора return в main() сделает его тип void.

Специальное правило, введенное параграфом 3.6.1/5 об оттекании конца main(), определяет:

[...] Если управление достигает конца main, не встречая оператора return, результатом является выполнение

return 0;

Формулировка гласит, что «эффект» во время выполнения программы такой же, как если бы присутствовал return 0, а не то, что в программу будет добавлен оператор return (который повлияет на вывод типа в соответствии с цитируемый абзац).

ИЗМЕНИТЬ:

Для этого существует Отчет о дефекте ( предоставлено Йоханнесом Шаубом ):

Предлагаемая резолюция (ноябрь 2013 г.):

Измените 3.6.1 [basic.start.main] пункт 2 следующим образом:

Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь объявленный возвращаемый тип типа int, но в остальном его тип определяется реализацией. Все реализации Реализация должна позволять

  • функция () возвращает int и
  • функция (int, указатель на указатель на char), возвращающая int

как тип...

person Andy Prowl    schedule 16.06.2013
comment
Но является ли вывод возвращаемого типа как int следствием выполнения return 0;? - person Ben Voigt; 16.06.2013
comment
@BenVoigt: Ну, эффект заключается не в добавлении return 0, а в 7.1.6.4/10 указывается, если функция с объявленным типом возвращаемого значения, использующая тип-заполнитель, не имеет операторов возврата [...]. Вытекание конца main не добавляет оператор return, поэтому остальная часть предложения должна применяться, а возвращаемый тип должен быть выведен как void - person Andy Prowl; 16.06.2013
comment
Вы говорите, что эффект выполнения означает, что эффекты времени компиляции не возникают? Существует ли на самом деле такое концептуальное различие? Мне трудно в это поверить. - person Johannes Schaub - litb; 16.06.2013
comment
@JohannesSchaub-litb: я говорю, что компилятор устроит вещи за капотом так, чтобы выполнение было идентично тому, которое было бы получено, если бы в программе явно присутствовал оператор return 0;. - person Andy Prowl; 16.06.2013
comment
Ах я вижу. Думаю, так можно читать. Но, тем не менее, какой-то разработчик clang опубликовал отчет об этом, чтобы прояснить спецификацию здесь. - person Johannes Schaub - litb; 16.06.2013
comment
@Andy: Итак, вы говорите, что соответствующий компилятор может отклонить код как неправильно сформированный, но если он продолжит компиляцию, поведение во время выполнения должно быть таким же, как если бы оператор return 0; присутствовал явно, по крайней мере, вплоть до присутствия или отсутствие неопределенного поведения? - person Ben Voigt; 16.06.2013
comment
@Бен: Не уверен, что понимаю. Я говорю, что компилятор должен отклонить код как неправильно сформированный, потому что отсутствие явного оператора return заставит вывод типа сделать вывод, что main имеет возвращаемый тип void, что является недопустимым. - person Andy Prowl; 16.06.2013
comment
@Andy: Но требуется ли диагностика для void main() или это просто неопределенное поведение? - person Ben Voigt; 16.06.2013
comment
@Ben: 3.6.1/2 не указывает, что диагностика не требуется, поэтому компилятор должен выдать диагностику - person Andy Prowl; 16.06.2013
comment
Согласно обсуждению основного рефлектора, это не будет разрешено, даже если main содержит оператор возврата, возвращающий int. main фактически является повторным объявлением объекта во время выполнения, и его объявленный тип возвращаемого значения должен соответствовать этому объекту. - person Richard Smith; 01.08.2013
comment
Итак, каков эффект return 0; в функции, которая возвращает void? - person user253751; 09.10.2014
comment
@immibis: Не уверен, что понимаю смысл вашего вопроса, в любом случае возврат что-либо из функции, тип возвращаемого значения которой void, неверен и вызовет ошибку компилятора. - person Andy Prowl; 10.10.2014