Функцией-кандидатом называется функция, имеющая то же имя, что и вызванная. Кандидаты отыскиваются двумя способами:
void f();
void f( int );
void f( double, double = 3.4 );
void f( char*, char* );
int main() {
f( 5.6 ); // для разрешения этого вызова есть четыре кандидата
return 0;
}
все четыре функции f() удовлетворяют этому условию. Поэтому множество кандидатов содержит четыре элемента;
namespace NS {
class C { /* ... */ };
void takeC( C& );
}
// тип cobj - это класс C, объявленный в пространстве имен NS
NS::C obj;
int main() {
// в точке вызова не видна ни одна из функций takeC()
takeC( cobj); // правильно: вызывается NS::takeC( C& ),
// потому что аргумент имеет тип NS::C, следовательно,
// принимается во внимание функция takeC(),
// объявленная в пространстве имен NS
return 0;
}
Таким образом, совокупность кандидатов является объединением множества функций, видимых в точке вызова, и множества функций, объявленных в том же пространстве имен, к которому принадлежат типы фактических аргументов.
При идентификации множества перегруженных функций, видимых в точке вызова, применимы уже рассмотренные ранее правила.
Функция, объявленная во вложенной области видимости, скрывает, а не перегружает одноименную функцию во внешней области. В такой ситуации кандидатами будут только функции из во вложенной области, т.е. такие, которые не скрыты при вызове. В следующем примере функциями-кандидатами, видимыми в точке вызова, являются format(double) и format(char*):
char* format( int );
void g() {
char *format( double );
char* format( char* );
format(3); // вызывается format( double )