A список инициализаторов в скобках (формально braced-init-list ) не является std::initializer_list
.Это может быть преобразовано в один, но это не один.Это также не тип контейнера.На самом деле это не тип, а грамматическая конструкция, состоящая из следующих последовательностей символов:
{initializer-list, opt }
{}
Поэтому этот синтаксис не будет работать напрямую:
Printer pi1 = {4,5,6};
Printer pi2 ({4,5,6}); //same as above if explicit
Если Printer
был агрегат , то он мог бы выполнить агрегатную инициализацию.
В противном случае вы застряли, приняв std::initializer_list
, который может быть создан из заключенного в скобки списка инициализатора , который вы предоставили.
Подробнееinfo:
То, что вы на самом деле делаете с этим синтаксисом, называется list-initialization , (агрегатная инициализация - это тип инициализации списка).Просто чтобы еще больше запутать, когда используется для инициализации типа типа T{a, b, c, ...}
, он называется list initializer .Это не следует путать с std::initializer_list
.
Когда в C ++ 11 был добавлен std::initializer_list
, он получил специальную обработку. braced-init-list теперь можно использовать для создания временного std::initializer_list
в конструкторе.Вот где вы внезапно обнаружили, что мы можем легко создать std::vector<int>
, как std::vector<int> vec{1, 2, 3, 4, 5, ...};
Однако следует опасаться, что конструкторы std::initializer_list
являются конструкторами с «высоким приоритетом», которые компилятор будетвыберите когда вы минимум подозреваемый .