Я читал этот ответ, в котором есть следующий пример:
struct R {};
struct S { S(R); };
struct T {
T(const T &); //1
T(S); //2
};
void f(T);
void g(R r) {
f({r});
}
Ответ связан со старой версией [over.best.ics]/4, которая тогда выглядела как это:
Однако при рассмотрении аргумента конструктора или определяемой пользователем функции преобразования, которая является кандидатом [over.match.ctor] при вызове для копирования/перемещения временного объекта на втором этапе инициализации копирования класса, by [over.match.list] при передаче списка инициализаторов в качестве одного аргумента или когда список инициализаторов имеет ровно один элемент и преобразование в некоторый класс X или ссылка на (возможно, cv-квалифицированный) X рассматривается для первого параметра конструктора X или с помощью [over.match.copy], [over.match.conv] или [over.match.ref] во всех случаях учитываются только стандартные последовательности преобразования и последовательности преобразования с многоточием. .
В ответе говорится, что без выделенной части в приведенной выше цитате f({r})
будет неоднозначным, потому что он может использовать либо первый конструктор T
(1), либо второй конструктор (2).
Однако, как бы я ни пытался, я не вижу, как первый конструктор (1) является вариантом. f({r})
приводит к инициализации списка копирования T
из {r}
. Если используется первый конструктор, стандарт разрешает преобразование из r
в тип параметра конструктора. Однако одного преобразования недостаточно, так как нужно будет перейти R --> S (используя конструктор преобразования S
), а затем S --> T (используя конструктор преобразования T
(2)). И я не могу найти в стандарте ничего, что допускало бы более одного определяемого пользователем преобразования в приведении к инициализации списка.
Я могу что-то упустить. Я был бы признателен, если бы кто-то указал, где я ошибаюсь, или, если я не ошибаюсь, я хотел бы знать, какова цель выделенного раздела в цитате из стандарта.
Текущая версия процитированного абзаца требует, чтобы единственным элементом списка инициализаторов был сам список инициализаторов, что имело бы смысл в приведенном выше примере, если бы вместо f({r})
было f({{r}})
. В этом случае объяснение будет правильным.
Спасибо.