Время жизни глобального / статического объекта списка std :: initializer - PullRequest
0 голосов
/ 26 декабря 2018

std::initializer_list в основном используется в качестве аргумента конструкторов / функций класса для копирования элементов списка в другой контейнер.Но как насчет создания глобального объекта с использованием std::initializer_list?Например:

struct ElemType {
    const char* name;
    bool        flag;
};

std::initializer_list<ElemType> MyGlobalData = { {"One",true}, {"Two",false} };

Если посмотреть на определение шаблона std::initializer_list (проверено в Visual Studio 2017), оно содержит только 2 элемента данных: const _Elem *_First и _Last.Это означает, что данные списка инициализатора должны храниться в автоматической переменной. Какой срок службы в этом случае?

Такой пример, протестированный в Visual Studio 2017, выглядит хорошо.Но я сомневаюсь, соответствует ли это поведение последнему стандарту C ++.

1 Ответ

0 голосов
/ 26 декабря 2018

Это хорошо определено.

[dcl.init.list] / 5 Объект типа std::initializer_list<E> создается из списка инициализатора, как если бы реализация генерировалась иматериализовал (7.4) значение типа «массив из N const E», где N - количество элементов в списке инициализатора.

[dcl.init.list] /6 Массив имеет то же время жизни, что и любой другой временный объект (15.2), за исключением того, что инициализация initializer_list объекта из массива продлевает время жизни массива точно так же, как привязка ссылки к временному объекту..

Акцент мой.

...