Ошибка компиляции для
// T t{u};
std::string a;
std::string b{a};
Сочетание четырех вещей
В проекте до недавнего времени говорилось, что если T
имеет конструктор списка инициализаторов (std::string
имеет один, принимая char
элементов), то список инициализаторов передается сам в качестве аргумента. Таким образом, аргументом для конструктора (ов) является не a
, а {a}
.
В проекте говорится, что список инициализатора, инициализирующий ссылку, создается не путем прямой привязки, а путем создания временного элемента вне списка в списке инициализатора, а затем привязки целевой ссылки к этому временному объекту.
В проекте говорится, что при инициализации ссылки списком инициализаторов, когда инициализация ссылки не является прямой привязкой, эта последовательность преобразования является определяемой пользователем последовательностью преобразования.
В проекте говорится, что при передаче самого списка инициализатора при рассмотрении конструкторов класса X
в качестве кандидатов в сценарии разрешения перегрузки в контексте, подобном описанному выше, затем при рассмотрении первого параметра конструктора типа "ссылка на cv X "(cv = const / volatile) - другими словами, весьма вероятно, что это конструктор копирования или перемещения, тогда никакие определенные пользователем преобразования не допускаются. В противном случае, если такое преобразование будет разрешено, вы всегда можете работать с неопределенностью, поскольку при инициализации списка вы не ограничены только одним вложенным определением, определенным пользователем.
Сочетание всего вышеперечисленного состоит в том, что нельзя использовать конструктор для взятия {a}
. Тот, кто использует initializer_list<char>
, не совпадает, а другие, использующие string&&
и const string&
, запрещены, потому что они потребуют определенных пользователем преобразований для привязки их параметра к {a}
.
.
Обратите внимание, что более поздняя версия изменила первое правило: они говорят, что если никакой конструктор списка инициализаторов не может взять список инициализаторов, то список аргументов состоит из всех элементов списка инициализаторов. С этим обновленным правилом ваш пример кода будет работать нормально.