2015-07-30 7 views
7

Questo è un follow-up su this question. Il codice nella domanda dell'OP mi sembrava abbastanza ragionevole e non ambiguo. Perché non C++ permette di utilizzare gli ex parametri per definire i valori di default di questi ultimi parametri, qualcosa di simile:Perché il C++ non consente i parametri di funzione utilizzati per i valori predefiniti ultimi parametri?

int foo(int a, int b = a); 

Inoltre, almeno in C++ 11 dichiarati tipi di parametri possono essere utilizzati per determinare il tipo di ritorno, in modo da non è inaudito di utilizzare i parametri di funzione in modo simile:

auto bar(int a) -> decltype(a); 

Così la domanda: quali sono la ragione (s) il motivo per cui non è consentita la dichiarazione di cui sopra di foo?

+4

Uno dei motivi che posso pensare è che per essere sano di mente ciò richiederebbe un vincolo su ordine di valutazione funzione di argomento, che è attualmente undefined in C++. Questo non è richiesto per l'esempio del tipo di ritorno. – MooseBoys

+0

Oltre alla praticità, se è possibile aggiungere una situazione in cui ciò è * non * realizzabile tramite sovraccarico, come risponde l'altra domanda, aggiungerebbe una quantità significativa di * bisogno *. Senza * bisogno * o retrocompatibilità, il comitato standard è piuttosto conservativo in aggiunta funzionalità. Tendono a stare alla larga da "perché no?" a favore del "perché" molto più rigoroso. – WhozCraig

+0

Come nota a margine: due convenzioni di chiamata più utilizzate in C++ ('__cdecl' e' __stdcall') [definiscono l'ordine da destra a sinistra] (https://msdn.microsoft.com/en-us/library/984x0h58 .aspx) dell'argomento che passa. Se esegui il debug del codice con alcuni parametri non trival (contenenti costruttori personalizzati) come argomenti di funzione e passo-in tale chiamata, noterai che i costruttori sono * effettivamente * chiamati in ordine inverso. –

risposta

7

Per una cosa, ciò richiederebbe che a sia valutato prima di , ma C++ (come C) non definisce l'ordine di valutazione per i parametri di funzione.

È ancora possibile ottenere l'effetto desiderato con l'aggiunta di un sovraccarico:

int foo(int a, int b) 
{ /* do something */ } 

int foo(int a) 
{ return foo(a, a); } 
+1

Non vedo come sia rilevante il fatto che C++ non specifichi un ordine di valutazione. Consentire ai parametri di essere utilizzati in valori predefiniti successivi ovviamente imporrebbe un certo ordine parziale quando viene utilizzata questa funzione. Ma non vedo come sarebbe un problema. Penso che la ragione per cui non è permesso è solo che il vantaggio sarebbe troppo piccolo. –