В качестве вопроса, который возник при обсуждении этого SO-вопроса:
Является ли это законным, возможно, с N3471, чтобы объявить объект constexpr std::initializer_list
? Пример:
constexpr std::initializer_list<int> my_list{};
Почему я думаю, что это может быть не законным: initializer_list
должен быть буквальным типом; но есть ли какие-либо гарантии, что это буквальный тип?
Цитаты из N3485.
[dcl.constexpr]/9:
Спецификатор constexpr, используемый в объявлении объекта, объявляет объект как const. Такой объект должен иметь буквальный тип и должен быть инициализирован.
литеральные типы типов, [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