2012-10-03 12 views
9

Il nuovo standard C++ 11 aggiunge una nuova sintassi dichiarazione di funzione con un tipo restituito finale:Perché il tipo di ritorno è precedente al nome della funzione?

// Usual declaration 
int foo(); 

// New declaration 
auto foo() -> int; 

Questa sintassi ha essere dedotto il vantaggio di permettere il tipo di ritorno, come in:

template<class T, class U> 
auto bar(T t, U u) -> decltype(t + u); 

Ma poi perché il tipo di reso è stato messo prima del nome della funzione in primo luogo? Immagino che una risposta sarà che non c'era bisogno di tale deduzione di tipo in quel momento. In tal caso, esiste un motivo per cui un nuovo ipotetico linguaggio di programmazione non utilizza il tipo di ritorno finale per impostazione predefinita?

+6

C++ in realtà non assomiglia C++ più ... = ( – paddy

+1

@paddy: E 'praticamente C+++ ora – Mehrdad

+2

@Mehrdad:.. A destra Se si ruota il secondo '1',' C+++ 'è quello che si ottiene –

risposta

6

Come sempre, K & R sono i "cattivi" qui. Hanno escogitato quella sintassi della funzione per C, e C++ l'ha praticamente ereditato così com'è.

In attesa di indovinare: In C, la dichiarazione dovrebbe suggerire l'utilizzo, cioè come ottenere il valore da qualcosa. Ciò si riflette in: valori

  • semplici: int i;, int si accede scrivendo i
  • puntatori: int *p;, int si accede scrivendo *p
  • array: int a[n];, int si accede scrivendo a[n]
  • Funzioni
  • : int f();, int si accede scrivendo f()

Quindi, l'intera scelta dipendeva dal caso "valori semplici". E come già notato da @JerryCoffin, il motivo per cui abbiamo ottenuto type name anziché name : type è probabilmente sepolto nella storia antica dei linguaggi di programmazione. Immagino che K & R abbia preso type name in quanto è più facile mettere l'accento sull'utilizzo e avere ancora puntatori, ecc.

Se avevano scelto name : type, Avrebbero o utilizzo disgiunti da dichiarazioni: p : int* o avrei puntatori fatte non essere tipi più e invece essere qualcosa come una decorazione per il nome: *p : int.

Su una nota personale: Immaginate se avessero scelto la seconda e C++ ereditaria che - semplicemente non avrebbe funzionato, visto che il C++ mette l'accento sul tipi invece di utilizzo.This is also the reason why int* p is said to be the "C++ way" and int *p to be the "C way".

In tal caso, esiste un motivo per cui un nuovo linguaggio di programmazione ipotetico non utilizza il tipo di ritorno finale per impostazione predefinita?

C'è un motivo per non utilizzare la detrazione per impostazione predefinita? ;) Vedi, ad es. Python o Haskell (o qualsiasi linguaggio funzionale per quello, IIRC) - nessun tipo di ritorno specificato esplicitamente. There's also a movement to add this feature to C++, quindi a volte in futuro potresti vedere solo auto f(auto x){ return x + 42; } o anche []f(x){ return x + 42; }.

+0

Un altro modo per leggere quei punti elenco: (1) 'i' è un 'int' ... se lo usiamo semplicemente. (2) 'p' è un 'int' ... se lo dereferenziamo. 'a' è un' int' ... se lo indicizziamo. 'f' è un 'int' ... se lo chiamiamo. – Mehrdad

5

C++ è basato su C, basato su B, basato su BCPL basato su CPL.

Sospetto che se si dovesse tracciare l'intera cronologia, si finirebbe probabilmente con Fortran, che utilizzava dichiarazioni come integer x (a differenza, ad esempio, di Pascal, che utilizzava dichiarazioni come: var x : integer;).

Allo stesso modo, per una funzione, Pascal ha utilizzato qualcosa come function f(<args>) : integer; Date le circostanze, è probabilmente sicuro supporre che (almeno in questo specifico aspetto) la sintassi di Pascal probabilmente si sarebbe adattata un po 'meglio alla deduzione di tipo.

+0

Vedendo come Brian Kernighan [ha scritto delle sue antipatie con Pascal] (http://www.lysator.liu.se/c/bwk-on-pascal.html), sembra chiaro perché la sintassi di Pascal non viene utilizzata. –

+0

@JesseGood: Sì e no - almeno per il mio ricordo (che non sembra essere contraddetto da una rapida occhiata sul foglio) non menziona 'int x;' vs. 'x: int' come qualcosa non gli piace di Pascal. Allo stesso tempo, dato quanto Pascal sembra essere stato in genere poco gradito, probabilmente hai ragione che copiare quasi tutto da esso probabilmente sarebbe stato impopolare. –

+2

@JerryCoffin Speriamo che questo sia il caso, e lo standard C++ 11 non è responsabile della sua partenza da questo regno terreno. – paddy