Ответ 1
Ошибка компиляции для
// 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}
.
Обратите внимание, что более поздний проект изменил первое правило: они говорят, что если конструктор списка инициализаторов не может принимать список инициализаторов, то список аргументов состоит из всех элементов списка инициализаторов. С помощью этого обновленного правила ваш примерный код будет работать нормально.