Głównym powodem może być to, że
void foo(bar, xyzzy = 0);
jest podobny do pary przeciążenia.
void foo(bar b) { foo(b, 0); }
foo(bar, xyzzy);
Ponadto, czasami jest korzystne, byłaby go w taki:
void foo(bar b) { /* something other than foo(b, 0); */ }
foo(bar, xyzzy);
Nawet kiedy napisany jako jeden, to wciąż jak dwie funkcje w jednym, z których żadna nie jest „korzystne” w jakimkolwiek sensie . Nazywasz funkcję jednego argumentu; dwuargumentowy jest faktycznie inną funkcją. Domyślna notacja argumentu po prostu łączy je w jeden.
Jeśli przeciążenie miało mieć charakter, o który prosisz, to dla zachowania spójności musiałoby działać w przypadku, gdy szablon jest podzielony na dwie definicje. To nie miałoby sensu, ponieważ wtedy dedukcja byłaby ciągnięciem typów z niezwiązanej funkcji, która nie jest wywoływana! A jeśli nie zostało to zaimplementowane, oznaczałoby to, że przeciążenie różnych długości listy parametrów staje się "obywatelem drugiej kategorii" w porównaniu do "argumentowania domyślnego".
Dobrze, jeśli różnica między przeciążeniami a defaultingiem jest całkowicie ukryta dla klienta.
Mówiąc "Ponieważ standard tak mówi" jest poprawną odpowiedzią, dobrze byłoby poznać uzasadnienie stojące za tym. –
Między innymi, różne deklaracje funkcji mogą zadeklarować różne domyślne argumenty (jestem prawie pewien, że to samo dotyczy szablonów funkcji). –
@James: Nie, różne deklaracje nie mogą zadeklarować innych domyślnych argumentów. Nawet w przypadku wielu deklaracji nie można podać tego samego domyślnego argumentu. 8.3.6 mówi: "Domyślny argument nie zostanie przekreślony przez późniejszą deklarację (nawet o tej samej wartości)." Oczywiście dotyczy to tylko funkcji innych niż szablony. W przypadku funkcji szablonu wygląda na to, że domyślne argumenty można podać tylko w deklaracji początkowej. –