Как вопрос, который пришел во время обсуждения this SO question:Является ли законным объявление объекта constexpr initializer_list?
Законно ли это, может быть, с N3471, чтобы объявить constexpr std::initializer_list
объект? Пример:
constexpr std::initializer_list<int> my_list{};
Почему я думаю, что это не может быть законным: initializer_list
должен быть буквальным типа; но есть ли какие-либо гарантии, что это буквальный тип?
Цитаты из N3485.
[dcl.constexpr]/9:
constexpr спецификатор используется в объявлении объекта объявляет объект константным. Такой объект должен иметь тип и должен быть инициализирован.
буквенные требования типов, [basic.types]/10, к югу от пулевых типов классов:
- тип класса (пункт 9), который имеет все из следующих свойств:
- У него есть тривиальный деструктор,
- каждый вызов конструктора и полное выражение в элементарных элементах для нестатических данных (если есть) является константным выражением (5.19),
- это совокупный тип (8.5.1) или имеет хотя бы один конструктор конструктора или конструктора constexpr, который не является конструктором копирования или перемещения, и
- все его нестатические элементы данных и базовые классы не являются -устойчивые типы литералов.
Бонусные баллы;) за ответы, если
constexpr std::initializer_list<int> my_list = {1,2,3,4,5};
является законным (со ссылками). Хотя я думаю, что это охватывается выше + [dcl.init.list]/5
Просто повторить то, что я сказал в чате: на самом деле я не собираюсь создавать 'std :: initializer_list' функции' constexpr' (N3741), если мы не можем законно записать последний пример. – Morwenn