Смогу ли я сделать следующее для основной функции в С++ 1y (С++ 14):
auto main()
{
// ...
}
Так будет ли возвращаемый тип автоматически int
, даже если нам не нужно использовать явный return 0;
?
Смогу ли я сделать следующее для основной функции в С++ 1y (С++ 14):
auto main()
{
// ...
}
Так будет ли возвращаемый тип автоматически int
, даже если нам не нужно использовать явный return 0;
?
Нет, не допустят. Параграф 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
как тип...
int
следствием выполнения return 0;
?
- person Ben Voigt; 16.06.2013
return 0
, а в 7.1.6.4/10 указывается, если функция с объявленным типом возвращаемого значения, использующая тип-заполнитель, не имеет операторов возврата [...]. Вытекание конца main
не добавляет оператор return
, поэтому остальная часть предложения должна применяться, а возвращаемый тип должен быть выведен как void
- person Andy Prowl; 16.06.2013
return 0;
.
- person Andy Prowl; 16.06.2013
return 0;
присутствовал явно, по крайней мере, вплоть до присутствия или отсутствие неопределенного поведения?
- person Ben Voigt; 16.06.2013
return
заставит вывод типа сделать вывод, что main
имеет возвращаемый тип void
, что является недопустимым.
- person Andy Prowl; 16.06.2013
void main()
или это просто неопределенное поведение?
- person Ben Voigt; 16.06.2013
main
содержит оператор возврата, возвращающий int
. main
фактически является повторным объявлением объекта во время выполнения, и его объявленный тип возвращаемого значения должен соответствовать этому объекту.
- person Richard Smith; 01.08.2013
return 0;
в функции, которая возвращает void
?
- person user253751; 09.10.2014
void
, неверен и вызовет ошибку компилятора.
- person Andy Prowl; 10.10.2014
void
. - person Puppy   schedule 16.06.2013auto
на одну букву длиннееint
. - person milleniumbug   schedule 16.06.2013return 0;
. - person Bartek Banachewicz   schedule 16.06.2013auto
в качестве возвращаемого типаmain()
. - person Ben Voigt   schedule 16.06.2013auto { ... }
. Очевидно, я хочу, чтобы здесь была функция запуска; автоматически вывести декларацию! :) - person Kaz   schedule 10.06.2014