5

Что делает компилятор C++ при появлении неоднозначных параметров по умолчанию? Например, допустим, что существует такая функция, как:Что делает компилятор C++ при появлении неоднозначных параметров по умолчанию?

void function(int a = 0, float b = 3.1); 
void function(int a, float b =1.1, int c = 0); 

Является ли вышеуказанное неоднозначным? Если нет, что делает компилятор (как точно такая же функция) при вызове что-то вроде function1(10)?

Спасибо!

+3

Ваши функции имеют разные идентификаторы. Нет никакой двусмысленности. Вы вместо этого хотели называть их «функцией»? – JoshD

+0

@JoshD: Вряд ли. Первый имеет 2 параметра, второй - 3. – AnT

+1

@ Андрей: вопрос не имеет смысла, если нет * * неоднозначности, поэтому комментарий Джоша относится к этому вопросу. – dmckee

ответ

8

Следующая отлично

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.

+1

Является ли эта функция void (int a = 0, float b); действительно нормально? Ты уверен? – Max

1

Если у них разные имена (как в вашем примере), нет никакой двусмысленности. Если они имеют одинаковое имя (так что это попытка перегрузки), компилятор будет жаловаться.

Хотя оказалось, что вы можете переопределить аргументы по умолчанию для функции в другой области (это новости для меня ...) - но в той же области действия вы не можете переопределять аргументы по умолчанию даже к тому же значение. от 8.3.6/4 «аргументов по умолчанию»:

Для функций, не шаблонных, по умолчанию аргументы могут быть добавлены в более поздних декларации функции в том же области. Объявления в разных объектах имеют совершенно разные наборы аргументов по умолчанию. То есть, объявления во внутренних областях не получают аргументы по умолчанию от деклараций во внешних областях и наоборот versa. В заданной функции декларация, все параметры, следующие , параметру с аргументом по умолчанию должны иметь аргументы по умолчанию в этой или предыдущих объявлениях. A аргумент по умолчанию не должен быть , переопределенный более поздним заявлением (не , даже с тем же значением).

0

Немного? У вас есть две совершенно независимые функции: function1 и function2. Даже количество параметров в каждой функции различно. Здесь нет никакой двусмысленности. Когда вы просите компилятор позвонить по телефону function1(10), он вызывает function1(10, 3.1). function2 даже не входит в картину.

Если бы это была одна и та же функция, то проблема двусмысленности возникла бы просто потому, что в C++ было запрещено указывать аргумент по умолчанию для одного и того же параметра более одного раза (в пределах той же единицы перевода). Даже из вас указать то же значение аргумента по умолчанию во второй раз, программа плохо сформированная

void foo(int a = 5); 
void foo(int a = 5); // <- ERROR 

Что можно сделать, хотя это указать другой набор аргументов по умолчанию для той же функции в различного перевода единиц. Но это не создает никакой двусмысленности, потому что компилятор может видеть только одну единицу перевода. Компилятор просто никогда не узнает о какой-либо потенциальной «двусмысленности» в этом случае.

+0

Что делать, если это две разные функции с тем же именем? Я думаю, что это действительно означает OP. –

-1

Кроме того, ответ на любой вопрос, начинающийся с «Что делает компилятор C++ ...», всегда будет «Зависит от того, какой компилятор вы говорите."

+0

Хорошо, допустим, это был компилятор GNU. – laluser

+0

Какая версия? .... filler characters ... –