Уважительной причиной может быть то, что
void foo(bar, xyzzy = 0);
похоже на пару перегрузок.
void foo(bar b) { foo(b, 0); }
foo(bar, xyzzy);
Более того, иногда его выгодно рефакторить в такой:
void foo(bar b) { /* something other than foo(b, 0); */ }
foo(bar, xyzzy);
Даже когда они написаны как одна, это по-прежнему похоже на две функции в одной, ни одна из которых не является «предпочтительной» в каком-либо смысле. Вы вызываете функцию с одним аргументом; функция с двумя аргументами фактически представляет собой другую функцию. Обозначение аргумента по умолчанию просто объединяет их в один.
Если бы перегрузка имела поведение, о котором вы просите, то для согласованности она должна была бы работать в случае, когда шаблон разбит на два определения. Это не имело бы смысла, потому что тогда вывод был бы извлечение типов из несвязанной функции, которая не вызывается! И если бы это не было реализовано, это означало бы, что перегрузка различных длин списка параметров становится «гражданином второго сорта» по сравнению с «аргументацией по умолчанию».
Хорошо, если разница между перегрузками и дефолтом будет полностью скрыта от клиента.
person
Kaz
schedule
09.03.2012