Ссылочная инициализация и прямое или косвенное связывание

Рассмотрим следующий случай

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, мы различаем только

  • Когда параметр ссылочного типа привязывается напрямую ([dcl.init.ref]) к выражению аргумента,
  • Если параметр привязывается непосредственно к результату применения функции преобразования к выражению аргумента,
  • Когда параметр ссылочного типа не связан непосредственно с выражением аргумента,

Для случая, как

void f(int &&);
f(A());

Случай 1 применим, но я уверен, что он не предназначен для применения. У меня такое ощущение, что «Во всех случаях, кроме последнего» предназначено не только для сопоставления с временным созданием, но и со вторым последним маркером или, в качестве альтернативы, со всей ветвью «В противном случае», которая содержит эти два маркера (т.е. «последний» относится к другому уровню в иерархии маркеров). Можете ли вы уточнить?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]