Когда параметр ссылочного типа 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