Следующее нормально
void function(int a = 0, float b = 3.1);
void function(int a, float b =1.1, int c = 0);
И следующее тоже хорошо
function(); // calls first function
Но следующее неоднозначно
function(1); // second and first match equally well
Для разрешения перегрузки (процесс, который сообщает, какую функцию вызывать), параметры, которые не получили явных аргументов и которые используют аргументы по умолчанию, игнорируются. Таким образом, компилятор действительно видит две функции, обе из которых имеют один параметр int для указанного выше вызова, и не могут принять решение.
Хотя следующее плохо сформировано
void function(int a = 0, float b = 3.1);
void function(int a, float b =1.1);
Если для кода в вашем вопросе вы объявляете две функции (поскольку оба объявления имеют разное количество параметров), в этом примере вы объявляете только одну функцию. Но второе его объявление повторяет аргумент по умолчанию для параметра (и даже с другим значением, но это больше не имеет значения). Это не разрешено Обратите внимание, что следующее хорошо
void function(int a, float b = 3.1);
void function(int a = 0, float b);
Набор аргументов по умолчанию для объявлений, которые появляются в одной и той же области для одной и той же функции, объединяются и только для тех, которые появляются в той же области. Таким образом, действует следующее
void function(int a = 0, float b = 3.1);
void function1() {
void function(int a, float b = 1.1);
function(0);
}
Вызывает функцию с 1.1
, переданным для b
.