2014-10-20 9 views
19

L'ultima bozza del C++ 14 che ero in grado di trovare, dice, per quanto riguarda main() [3.6.1]:definizioni legali di main() in C++ 14

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

- una funzione di() di ritorno int e

- una funzione di (int, puntatore a puntatore a char) di ritorno int

e (punto 5)

Se il controllo raggiunge la fine principale senza incontrare un'istruzione return, l'effetto è quello di eseguire

return 0;

Ciò significa che tutti i seguenti sono programmi minimi C++ 14 legali? Se qualcuno non lo è, perché no?

  1. auto main() -> int {}
  2. auto main() { return 0; }
  3. auto main() {}
+13

L'ultimo non è legale come 'auto' deduce il tipo restituito come' void'. Vedi http://stackoverflow.com/questions/17134975/will-automatic-return-type-deduction-work-for-main – 0x499602D2

+0

@ 0x499602D2 La seconda citazione non implica che il tipo di ritorno debba essere dedotto come 'int' per caso 3? –

+0

@TristanBrindle La risposta nel collegamento lo spiega. – 0x499602D2

risposta

15
  1. è legale, la seconda e questi ultimi non sono a causa dei seguenti motivi:

  2. Il tipo di ritorno della funzione principale non può essere dedotta dal CWG 1669 è stata accettata e la norma sarà riformulata come:

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

    Questo ha ottenuto la sua strada in n4140. Maggiori informazioni su questo: http://wg21.cmeerw.net/cwg/issue1669

  3. Lo stesso come sopra

+0

Il tipo di ritorno di una funzione (diverso da un lambda) non viene mai dedotto. Una dichiarazione di funzione deve avere la forma classica, con il tipo restituito in primo piano o un tipo di ritorno finale. –

+7

@JamesKanze Questo non è più vero per C++ 14 –

+0

Devo concordare con Tristan: n4140 §7.1.6.4/p2: 'Se la funzione dichiarator include un tipo di ritorno trailing (8.3.5), che specifica il tipo di reso dichiarato della funzione. Se il tipo di ritorno dichiarato della funzione contiene un tipo di segnaposto, il tipo di ritorno della funzione è dedotto dalle dichiarazioni di ritorno nel corpo della funzione, se presente. " –

1

Il primo è probabilmente legale. Gli altri due non sono certamente (§7.1.6.4/1): "Lo specifier del tipo auto indica che il tipo di una variabile dichiarata deve essere dedotto dal suo inizializzatore o che un dichiaratore di funzione deve includere un trailing-return -genere."

Dico probabilmente per il primo, perché §3.1.1 non è veramente chiaro in che misura deve corrispondere la definizione. Non è necessaria una corrispondenza testuale al 100% , anche se questo è ciò che un'interpretazione letterale di implica: nel testo, il corpo di main è dato come /* ... */, che non è molto utile, e certamente non richiesto. Allo stesso modo, la tradizione ha permesso anche qualsiasi nome per argc e argv e dichiarando argv come char** argv. Non c'è tradizione nella definizione di main con un tipo di ritorno finale , tuttavia. Penso che ciò che si intendeva nel §3.6.1 sia che tutte le definizioni di main che hanno la stessa firma siano consentite, ma questo non è ciò che dicono le parole effettive.

Indipendentemente da ciò: perché si vorrebbe tale offuscamento? C/C++ non è Pascal e ciò che è naturale in una lingua (come il trailing tipi di ritorno per le funzioni) è l'offuscamento in un'altra.

EDIT:

Ho appena scaricato un progetto più recente (N3797), e sembra come la formulazione è cambiato (ed è ora contraddittorio).Il primo paragrafo del dice ancora fondamentalmente la stessa cosa (ma include un termine aggiuntivo per lambda): lo auto è sostituito "sia dalla deduzione da un inizializzatore o dalla specifica esplicita con un tipo di ritorno finale". (E naturalmente, le funzioni non hanno inizializzatori, quindi può essere applicato solo il tipo di trailing-return .) I paragrafi successivi, tuttavia, parlano di detrazione dal tipo restituito, anche se il primo paragrafo richiede il trattino finale tipo di ritorno (e quindi rende superflua la deduzione).

+0

"Indipendentemente da ciò: perché si vorrebbe una tale offuscazione?" Non lo farei, ero solo curioso :-) –