|
|
Когда функция с некоторым именем используется без параметров, среди всех функций с таким именем в текущей области видимости выбирается единственная, которая точно соответствует назначению. Назначением может быть:
Отметим, что если f() и g() являются перегруженными функциями, то для правильной интерпретации f(&g) или эквивалентного выражения f(g) нужно рассмотреть пересечение множеств выбора для f() и g(). Приведем пример:
int f(double); int f(int); int (*pfd)(double) = &f; int (*pfi)(int) = &f; int (*pfe)(...) = &f; // ошибка: несоответствие типов
Последняя инициализация ошибочна, не из-за неоднозначности, а
потому, что не определено ни одной функции f() типа int(...).
Отметим, что не существует никакого стандартного преобразования
($$R.4) указателя на функцию одного типа в указатель на функцию
другого типа ($$R.4.6). В частности, даже если B является общим
базовым классом D, две следующие инициализации недопустимы:
D* f();
B* (*p1)() = &f; // ошибка
void g(D*);
void (*p2)(B*) = &g; // ошибка
| |