std::initializer_list
s обычно следует использовать только как параметры функции или в циклах с заданным диапазоном. Вместо этого используйте правильный контейнер, например std::vector
.
Ваши initializer_list
болтаются.
initializer_list
работают как ссылки, указывающие на временные массивы, с тем же временем жизни extension rules:
Базовый массив - это временный массив типа const T[N]
, в котором каждый элемент инициализируется копией (за исключением того, что сужающие преобразования недопустимы) из соответствующего элемента исходный список инициализаторов. Время жизни базового массива такое же, как и у любого другого временного объекта, за исключением того, что инициализация объекта initializer_list
из массива продлевает время жизни массива точно так же, как привязка ссылки к временному (с тем же исключения, например, для инициализации нестатического c члена класса). Базовый массив может быть выделен в памяти только для чтения.
- cppreference , акцент мой
Если вы создали initializer_list
как отдельную переменную, Продление срока жизни будет работать:
std::initializer_list<int> foo = {1, 2, 3};
Но в вашем случае это не сработает, потому что:
В общем, время жизни временного не может быть дополнительно продлено путем «передачи it on ": вторая ссылка, инициализированная из ссылки, к которой был привязан временный объект, не влияет на его время жизни.
- cppreference
Процесс Построение std::map<std::string, std::initializer_list<std::string>>
включает в себя копирование / перемещение initializer_list
, так что это никак не может работать.