16 Overloading [over]

16.3 Overload resolution [over.match]

16.3.2 Viable functions [over.match.viable]

Из набора функций-кандидатов, созданных для данного context ([over.match.funcs]), выбирается набор жизнеспособных функций, из которых будет выбрана лучшая функция путем сравнения последовательностей преобразования аргументов для наилучшего соответствия ([over.match.best]). При выборе жизнеспособных функций учитываются отношения между аргументами и параметрами функции, кроме ранжирования последовательностей преобразования.

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

  • Еслиm в списке есть аргументы, все функции-кандидаты, имеющие точно m параметры, являются жизнеспособными.

  • Функция-кандидат, имеющая меньше m параметров, жизнеспособна, только если в ее списке параметров есть многоточие ([dcl.fct]). В целях разрешения перегрузки любой аргумент, для которого нет соответствующего параметра, считается «совпадающим с многоточием» ([over.ics.ellipsis]).

  • Функция-кандидат, имеющая болееm параметров, жизнеспособна, только если (m+1)-st параметр имеет расширение default argument.130 В целях разрешения перегрузки список параметров усечен справа, так что есть ровно m параметры.

Во-вторых, F чтобы быть жизнеспособной функцией, для каждого аргумента должен существовать объект, implicit conversion sequence который преобразует этот аргумент в соответствующий параметр F. Если параметр имеет ссылочный тип, неявная последовательность преобразования включает в себя операцию привязки ссылки, и тот факт, что ссылка lvalue на non-const не может быть привязана к rvalue и что ссылка rvalue не может быть привязана к lvalue, может повлиять на жизнеспособность функции (см. [over.ics.ref]).

Согласно [dcl.fct.default], параметры, следующие за (m+1)-st параметром, также должны иметь аргументы по умолчанию.