16 Overloading [over]

16.3 Overload resolution [over.match]

16.3.1 Candidate functions and argument lists [over.match.funcs]

16.3.1.1 Function call syntax [over.match.call]

16.3.1.1.2 Call to object of class type [over.call.object]

Если primary-expression E синтаксис вызова функции оценивается как объект класса типа «cv T», то набор функций-кандидатов включает в себя, по крайней мере, операторы вызова функций T. Операторы вызова функции T получаются обычным поиском имени operator() в контексте (E).operator().

Кроме того, для каждой неявной функции преобразования, объявленной в T форме

operator conversion-type-id () cv-qualifier ref-qualifieropt noexcept-specifieropt attribute-specifier-seqopt ;

где cv-qualifier такая же CV-квалификация, что и, или более высокая CV-квалификация, чем,, cvи где conversion-type-id обозначает тип «указатель на функциюP1,,Pnвозврата ( ) R», или тип «ссылка на указатель на функциюP1,,Pnвозврата ( ) R», или введите «ссылка на функциюP1,,Pnвозврата ( ) R», surrogate call function с уникальным именем call-function и имеющей форму

R call-function ( conversion-type-id  F, P1 a1, , Pn an) { return F (a1, , an); }

также рассматривается как функция-кандидат. Точно так же суррогатные функции вызова добавляются к набору функций-кандидатов для каждой неявной функции преобразования, объявленной в базовом классе, при T условии, что функция не скрыта внутри T другим промежуточным объявлением127.

Если такая суррогатная функция вызова выбрана разрешением перегрузки, соответствующая функция преобразования будет вызвана для преобразования E в соответствующий указатель функции или ссылку, а затем функция будет вызвана с аргументами вызова. Если функция преобразования не может быть вызвана (например, из-за двусмысленности), программа сформирована неправильно.

Список аргументов, представленный для разрешения перегрузки, состоит из выражений аргументов, присутствующих в синтаксисе вызова функции, которым предшествует подразумеваемый аргумент объекта (E). [ Note: При сравнении вызова с операторами вызова функции подразумеваемый аргумент объекта сравнивается с неявным параметром объекта оператора вызова функции. При сравнении вызова с суррогатной функцией вызова, подразумеваемый аргумент объекта сравнивается с первым параметром суррогатной функции вызова. Функция преобразования, из которой была получена суррогатная функция вызова, будет использоваться в последовательности преобразования для этого параметра, поскольку она преобразует подразумеваемый аргумент объекта в соответствующий указатель функции или ссылку, требуемую этим первым параметром. ] [end noteExample:

int f1(int);
int f2(float);
typedef int (*fp1)(int);
typedef int (*fp2)(float);
struct A {
  operator fp1() { return f1; }
  operator fp2() { return f2; }
} a;
int i = a(1);                   // calls f1 via pointer returned from conversion function

end example]

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