Una buona ragione potrebbe essere che
void foo(bar, xyzzy = 0);
è simile ad una coppia di sovraccarichi.
void foo(bar b) { foo(b, 0); }
foo(bar, xyzzy);
Inoltre, a volte è vantaggioso refactoring in tale:
void foo(bar b) { /* something other than foo(b, 0); */ }
foo(bar, xyzzy);
Anche quando scritto come uno, è ancora come due funzioni in un unico, nessuno dei quali è "preferito" in alcun senso . Stai chiamando la funzione a un argomento; quello a due argomenti è effettivamente una funzione diversa. La notazione degli argomenti predefinita li fonde in uno solo.
Se il sovraccarico dovesse avere il comportamento che si sta richiedendo, quindi per coerenza dovrebbe funzionare nel caso in cui il modello è diviso in due definizioni. Ciò non avrebbe senso perché quindi la deduzione sarebbe tirare i tipi da una funzione non correlata che non viene chiamata! E se non fosse implementato, significherebbe che sovraccaricare diverse lunghezze di lista dei parametri diventa un "cittadino di seconda classe" rispetto a "default-argumenting".
È utile se la differenza tra sovraccarico e impostazione predefinita è completamente nascosta al client.
Mentre dire "Perché lo standard dice così" è una risposta valida, sarebbe bello conoscere il ragionamento che c'è dietro. –
Tra le altre ragioni, dichiarazioni diverse di una funzione possono dichiarare diversi argomenti predefiniti (sono abbastanza sicuro che lo stesso si applica ai modelli di funzione). –
@James: No, dichiarazioni diverse non possono dichiarare argomenti predefiniti diversi. Non è nemmeno permesso che più dichiarazioni diano lo stesso valore predefinito allo stesso argomento. 8.3.6 dice "Un argomento di default non deve essere ridefinito da una dichiarazione successiva (nemmeno con lo stesso valore)." Ovviamente, ciò vale solo per le funzioni non di modello. Per le funzioni del modello, sembra che gli argomenti predefiniti possano essere forniti solo nella dichiarazione iniziale. –