Следующая отлично
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
Для разрешения перегрузки (процесс, который говорит, что функция для вызова), параметры, которые не передали явные аргументы и которые используют defau Аргументы игнорируются. Таким образом, компилятор действительно видит две функции, имеющие один параметр 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
.
Ваши функции имеют разные идентификаторы. Нет никакой двусмысленности. Вы вместо этого хотели называть их «функцией»? – JoshD
@JoshD: Вряд ли. Первый имеет 2 параметра, второй - 3. – AnT
@ Андрей: вопрос не имеет смысла, если нет * * неоднозначности, поэтому комментарий Джоша относится к этому вопросу. – dmckee