Per esempio, perché non riesco a scrivere questo:Perché non posso usare i valori degli argomenti precedenti per definire i valori di default degli argomenti?
void f(double x, double y = x);
per dichiarare una funzione f
, per il quale la chiamata f(x)
è equivalente a f(x,x)
?
Nel caso in cui questo non ti sembra utile, ecco un possibile scenario di utilizzo. In questo esempio, dichiaro f
come segue:
void f(double x, double y = expensiveComputation(x));
dove expensiveComputation
denota, avete indovinato, una funzione che esegue un calcolo molto lento. Voglio dare all'utente di f
la possibilità di passare il valore di se lo ha già calcolato in precedenza, quindi non devo computarlo di nuovo all'interno di f
. Ora, naturalmente posso anche risolvere questo scrivendo due overload:
void f(double x, double y);
void f(double x) { f(x, expensiveComputation(x)); }
ma scrivere sovraccarichi diventa faticoso come il numero di argomenti cresce. Ad esempio, prova a scrivere:
void f(double x, double p = expensiveComputation(x),
double q = expensiveComputation2(x, p),
double r = expensiveComputation3(x, p, q),
double s = expensiveComputation3(x, p, q, r));
utilizzando sovraccarichi. È solo più brutto. Gli argomenti predefiniti sono sexy. Esiste un motivo sintattico più profondo per cui gli argomenti precedenti non possono essere utilizzati per definire i valori predefiniti degli argomenti?
Consentire questa sintassi forzerebbe l'implementazione a valutare gli argomenti da sinistra a destra? – Brian
@Brian Buon punto. Perché l'implementazione non è obbligata a valutare gli argomenti da sinistra a destra? Dimenticavo ... – becko
Su molte piattaforme la convenzione di chiamata predefinita è quella di spingere gli argomenti nello stack a partire da quello più a destra e procedendo verso sinistra. (Il callee viene quindi visualizzato da sinistra a destra.) – Brian