Если бы initializer_list
было определено как std::initializer_list<type, size>
, то любая функция, принимающая initializer_list<type>
, где type
— некоторый конкретный тип, теперь должна была бы быть шаблонной функцией, основанной на размере этого списка. Или они должны будут требовать, чтобы пользователи передавали initializer_list
определенного типа и размера.
И то, и другое довольно неприемлемо. Не все пишут весь свой код в виде шаблонов.
Вы можете инициализировать std::array
из списка инициализации в фигурных скобках ({}
с элементами посередине). Но это не то же самое, что std::intiializer_list
. Класс array
является агрегатным типом. Это структура, содержащая один элемент, который является общедоступным массивом. Следовательно, в соответствующих реализациях С++ 11 это должно скомпилироваться:
std::array<int, 3> myArray = {1, 3, 5};
Однако {1, 3, 5}
не является объектом std::initializer_list
; это просто список инициализации в фигурных скобках, который можно использовать для инициализации соответствующих типов.
Вы не можете передать объект std::initializer_list
конструктору агрегата (поскольку агрегаты не имеют конструкторов), но вы можете использовать список инициализации в фигурных скобках, чтобы вызвать агрегатную инициализацию для инициализации std::array
, как и для любой структуры, содержащей массив.
Разница между std::initializer_list
и списком инициализации в фигурных скобках немного похожа на разницу между int
и литералом 0
. Неявное преобразование объекта int
в тип указателя (обычно) недопустимо, но допустимо неявное преобразование целочисленного литерала 0 в тип указателя. Принцип работы braced-init-lists такой:
int i = 0; //Legal
void *j = 0; //Legal
void *k = i; //Not legal
std::array<int, 3> myArray = {1, 3, 5}; //Legal
std::initializer_list<int> myInitList = {1, 3, 5}; //Legal
std::array<int, 3> myArray = myInitList; //Not legal
person
Nicol Bolas
schedule
18.08.2011
std::initializer_list::size
неconstexpr
(больше)? который был задан на clc++m год назад. - person MSalters   schedule 18.08.2011std::initializer_list::size
функциейconstexpr
, хотя С++ 11 этого не сделал. en.cppreference.com/w/cpp/utility/initializer_list/size - person Quuxplusone   schedule 22.01.2014