16 Overloading [over]

16.3 Overload resolution [over.match]

16.3.3 Best viable function [over.match.best]

16.3.3.1 Implicit conversion sequences [over.best.ics]

16.3.3.1.4 Reference binding [over.ics.ref]

Когда параметр ссылочного типа binds directly на выражение аргумента, неявная последовательность преобразования является преобразованием идентичности, если только выражение аргумента не имеет тип, который является производным классом типа параметра, и в этом случае последовательность неявного преобразования является производным преобразованием в- базовое преобразование ([over.best.ics]). [Example:

struct A {};
struct B : public A {} b;
int f(A&);
int f(B&);
int i = f(b);       // calls f(B&), an exact match, rather than f(A&), a conversion

end example] Если параметр привязывается непосредственно к результату применения функции преобразования к выражению аргумента, неявная последовательность преобразования - это a user-defined conversion sequence, а вторая стандартная последовательность преобразования - либо преобразование идентичности, либо, если функция преобразования возвращает объект типа, который является производный класс типа параметра, преобразование производного в базовое.

Когда параметр ссылочного типа не привязан напрямую к выражению аргумента, последовательность преобразования - это та последовательность, которая требуется для преобразования выражения аргумента в ссылочный тип в соответствии с [over.best.ics]. Концептуально эта последовательность преобразования соответствует копированию-инициализации временного объекта указанного типа с помощью выражения аргумента. Любое различие в CV-квалификации верхнего уровня учитывается самой инициализацией и не является преобразованием.

За исключением неявного параметра объекта, о котором см. [over.match.funcs], Стандартная последовательность преобразования не может быть сформирована, если она требует привязки ссылки lvalue, отличной от ссылки на энергонезависимый const тип, к rvalue или привязки ссылки rvalue к lvalue, отличному от функции lvalue. [ Note: Это означает, например, что функция-кандидат не может быть жизнеспособной функцией, если она имеетconst параметр ссылки, отличного от lvalue (кроме неявного параметра объекта), и соответствующий аргумент потребует создания временного элемента для инициализации ссылки lvalue ( см. [dcl.init.ref]). ]end note

Однако другие ограничения на привязку ссылки к конкретному аргументу, не основанные на типах ссылки и аргумента, не влияют на формирование стандартной последовательности преобразования. [ Example: Функция с параметром «lvalue ссылка на int» может быть жизнеспособным кандидатом, даже если соответствующий аргумент является int битовым полем. Формирование последовательностей неявного преобразования обрабатывает int битовое поле как int lvalue и находит точное совпадение с параметром. Если функция выбрана путем разрешения перегрузки, вызов, тем не менее, будет неправильно сформирован из-за запрета на привязкуconst ссылки, отличной от lvalue, к битовому полю ([dcl.init.ref]). ]end example