Is the following valid in C++14?
auto main()
{
// ...
}
Will the return type deduce to int
even though we don't need to use an explicit return 0;
?
No, it isn't allowed. Paragraph 7.1.6.4/10 of the C++14 Standard Draft N3690 specifies:
If a function with a declared return type that uses a placeholder type has no
return
statements, the return type is deduced as though from areturn
statement with no operand at the closing brace of the function body. [...]
This means that omitting a return
statement in main()
would make its type void
.
The special rule introduced by paragraph 3.6.1/5 about flowing off the end of main()
specifies:
[...] If control reaches the end of
main
without encountering areturn
statement, the effect is that of executingreturn 0;
The wording says that the "effect" during the execution of the program is the same as though a return 0
was present, not that a return
statement will be added to the program (which would affect type deduction according to the quoted paragraph).
EDIT:
There is a Defect Report for this (courtesy of Johannes Schaub):
Proposed resolution (November, 2013):
Change 3.6.1 [basic.start.main] paragraph 2 as follows:
An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a declared return type of type int, but otherwise its type is implementation-defined.
All implementationsAn implementation shall allow both
- a function of
()
returningint
and- a function of (
int
, pointer to pointer tochar
) returningint
as the type...