Например, почему я не могу написать это:
void f(double x, double y = x);
объявить функцию f
, для которой вызов f(x)
эквивалентен f(x,x)
?
Если это не кажется вам полезным, вот возможный сценарий использования. В этом примере я объявляю f
следующим образом:
void f(double x, double y = expensiveComputation(x));
где expensiveComputation
обозначает, как вы уже догадались, функцию, которая выполняет очень медленные вычисления. Я хочу дать пользователю f
возможность передать значение y
, если он вычислил его ранее, поэтому мне не нужно вычислять его снова внутри f
. Теперь, конечно, я также могу решить эту проблему, написав две перегрузки:
void f(double x, double y);
void f(double x) { f(x, expensiveComputation(x)); }
но написание перегрузок становится утомительным по мере роста числа аргументов. Например, попробуйте написать:
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));
с использованием перегрузок. Это просто уродливее. Аргументы по умолчанию сексуальны. Есть ли более глубокая синтаксическая причина, по которой предыдущие аргументы нельзя использовать для определения значений аргументов по умолчанию?