logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.13.3 Адрес перегруженной функции

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

всех функций с таким именем в текущей области видимости выбирается

единственная, которая точно соответствует назначению. Назначением

может быть:

инициализируемый объект ($$R.8.4);

левая часть операции присваивания ($$R.5.17);

формальный параметр функции ($$R.5.2.2);

формальный параметр пользовательской операции ($$R.13.4);

тип значения, возвращаемого функцией ($$R.8.2.5).

Отметим, что если 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; // ошибка