À partir 3.6.1/2 (l'emphase est mienne):
[...]il doit avoir un type de retour déclaré de type int
, mais sinon, il est de type définies par l'implémentation.
Lors de l' auto
est utilisé sans une fuite de type de retour, l' a déclaré le type de retour d'une fonction est toujours auto
, même si le déduire le type de retour peut être autre chose. La différence entre déclarée et déduit n'est pas énoncé clairement dans la norme, mais 7.1.6.4/7 peut jeter de la lumière:
Quand [...] un return
déclaration se produit dans une fonction déclarée avec un type de retour qui contient un espace réservé à un type, le déduit le type de retour [...] est déterminée à partir du type de son initialiseur. Dans le cas d'un return
sans opérande ou avec un opérande de type void
, la déclaration de type de retour doit être auto
et le déduit le type de retour est - void
.
Ma compréhension est que, avec ceci:
auto main(){ return 0; }
le type de retour déclaré seraient encore en auto
, bien que la déduit le type de retour serait int
. Comme par 3.6.1/2 ci-dessus, a déclaré le type de retour d' main
doit être int
. Donc, c'est mal formé.
Cependant, une fuite en type de retour est considéré comme un type de retour déclaré. De 7.1.6.4/2:
Si la fonction de demande de déclaration comprend une fuite-retour-type (8.3.5), que la fuite-retour de type spécifie la déclaration de type de retour de la fonction.
$ cat a.cpp
auto main() -> int {}
$ g++ -Wall -std=c++14 a.cpp
$
Toutes les citations sont identiques dans les deux C++14 et C++17.