2013-11-13 6 views
1
void f(); 
void f(int); 
void f(int, int); 
void f(double, double = 3.14); 
f(5.6); // calls void f(double, double) and not f(int) or f(), for that matter. Why? 

Я прочитал, что компилятор проверяет количество параметров перед проверкой типа параметров. Тогда почему не все функции, устраняющие различное количество параметров?Функция перегрузки разрешения

+0

Параметры, для которых не были предоставлены аргументы (на сайте вызова) и которые имеют аргументы по умолчанию * игнорируются * для разрешения перегрузки [over.match.viable]/2. – dyp

ответ

2

Он вызывает void f(double, double = 3.14); из-за значения по умолчанию для второго аргумента; один двойной, один обязательный -> матч. В противном случае будет выбрано значение void f(int);. Таким образом, это число обязательных параметров, которые имеют значение.

Дополнительная информация:

+0

ADL? Вы имеете в виду разрешение перегрузки? Это не имеет никакого отношения к поиску имени. – dyp

+0

@ DyP: Спасибо. Насколько я знаю, это зависит от фактического контекста, независимо от того, используется ли ADL дополнительно для поиска имени. Он может применяться для сбора других кандидатов для разрешения перегрузки. Упоминание ADL в сочетании с фрагментом кода OP было введено в заблуждение, поэтому я удалил эту часть. – Sam

+0

«используется ли ADL дополнительно для поиска имени» ADL - это * форма * поиска имени; он всегда используется, когда имя функции является неквалифицированным (квалифицировано: 'my_class_or_namespace :: f'; unqualified:' f'). Кстати, вы дважды включили ссылку на cppreference;) – dyp

1

Вы определили второе значение из функции:

void f(double, double = 3.14); 

Поэтому вызов

f(5.6); 

, как

f(5.6, 3.14); 

использования явного типа преобразования, чтобы вызвать другую функцию , например:

f((int)5.6); 
Смежные вопросы