Ще мога ли да направя следното за основната функция в C++1y (C++14):
auto main()
{
// ...
}
Така че върнатият тип автоматично ще бъде int
, въпреки че не е необходимо да използваме изрично return 0;
?
Ще мога ли да направя следното за основната функция в C++1y (C++14):
auto main()
{
// ...
}
Така че върнатият тип автоматично ще бъде int
, въпреки че не е необходимо да използваме изрично return 0;
?
Не, няма да бъде позволено. Параграф 7.1.6.4/10 от C++14 Standard Draft 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