Il lavoro di deduzione del tipo di reso automatico sarà principale?

Sarò in grado di eseguire quanto segue per la funzione principale in C ++ 1y (C ++ 14):

auto main() { // ... } 

Quindi il tipo restituito sarà automaticamente int anche se non abbiamo bisogno di usare un return 0; esplicito return 0; ?

No, non sarà permesso. Il paragrafo 7.1.6.4/10 della bozza standard C ++ 14 N3690 specifica:

Se una funzione con un tipo di reso dichiarato che usa un tipo segnaposto non ha istruzioni di return , il tipo di ritorno viene dedotto come da un’istruzione return con nessun operando alla parentesi chiusa del corpo della funzione. […]

Ciò significa che l’omissione di un’istruzione return in main() renderebbe void suo tipo.

La regola speciale introdotta dal paragrafo 3.6.1 / 5 sul fluire alla fine di main() specifica:

[…] Se il controllo raggiunge la fine della main senza incontrare un’istruzione return , l’effetto è quello dell’esecuzione

 return 0; 

La dicitura dice che “l’effetto” durante l’ esecuzione del programma è lo stesso come se fosse presente un return 0 , non che un’istruzione di return sarà aggiunta al programma (che influirebbe sulla deduzione di tipo secondo il paragrafo citato).

MODIFICARE:

C’è un rapporto sui difetti per questo (per gentile concessione di Johannes Schaub ):

Risoluzione proposta (novembre 2013):

Modificare 3.6.1 [basic.start.main] paragrafo 2 come segue:

Un’implementazione non deve predefinire la funzione principale. Questa funzione non deve essere sovraccaricata. Deve avere un tipo di ritorno dichiarato di tipo int, ma in caso contrario il suo tipo è definito dall’implementazione. Tutte le implementazioni Un’implementazione deve consentire entrambe

  • una funzione di () restituisce int e
  • una funzione di ( int , puntatore a puntatore a char ) che restituisce int

come il tipo …