Рассмотрим следующий случай
struct A {
operator int();
};
int &&x = A();
Спецификация говорит в http://eel.is/c++draft/dcl.init.ref#5 о том, является ли ссылочная привязка прямой или косвенной
Во всех случаях, кроме последнего (то есть при создании и инициализации временного объекта из выражения инициализатора), говорят, что ссылка связывается непосредственно с выражением инициализатора.
Вышеуказанный случай не соответствует последнему, а второму последнему пулу.
Если T1 или T2 является типом класса, а T1 не связан со ссылкой на T2, считаются пользовательские преобразования … Результат вызова функции преобразования, как описано для не-ссылочной инициализации копирования, равен используется для прямой инициализации ссылки.
Поэтому связывание A()
к ссылке косвенное связывание. Чтобы продолжить, мы вернемся к исходной инициализации снова, теперь с prvalue типа int
, пытаясь инициализировать int&&
, Теперь мы получим последнюю пулю, что означает прямая привязка.
Итак, что мы можем сказать о привязке ссылки … она связывает прямо или косвенно? Делает ли это оба, в зависимости от того, какое выражение вы рассматриваете (выражение инициализатора против результата вызова функции преобразования)?
В нашем случае, в частности, параграфы, кажется, говорят мы привязываем непосредственно к выражению инициализатора и косвенно привязываем к результату преобразования в выражении инициализатора. Тем не менее, в главе о спасении перегрузки http://eel.is/c++draft/over.ics.ref, мы различаем только
Для случая, как
void f(int &&);
f(A());
Случай 1 применим, но я уверен, что он не предназначен для применения. У меня такое ощущение, что «Во всех случаях, кроме последнего» предназначено не только для сопоставления с временным созданием, но и со вторым последним маркером или, в качестве альтернативы, со всей ветвью «В противном случае», которая содержит эти два маркера (т.е. «последний» относится к другому уровню в иерархии маркеров). Можете ли вы уточнить?
Задача ещё не решена.
Других решений пока нет …