come una questione che è venuto durante la discussione di this SO question:È legale dichiarare un oggetto inizializer_list di constexpr?
E 'legale, magari con N3471, per dichiarare un oggetto constexpr std::initializer_list
? Esempio:
constexpr std::initializer_list<int> my_list{};
Perché penso che potrebbe non essere legale: initializer_list
avrebbe dovuto essere un tipo letterale; ma ci sono garanzie che sia un tipo letterale?
Citazioni da N3485.
[dcl.constexpr]/9:
Un identificatore constexpr utilizzato in una dichiarazione oggetto dichiara l'oggetto come const. Tale oggetto deve avere il tipo letterale e deve essere inizializzato.
requisiti letterali tipi, [basic.types]/10, sub-proiettile tipi di classe:
- un tipo di classe (Clausola 9), che contiene tutte le seguenti proprietà:
- ha un distruttore banale,
- ogni chiamata del costruttore e full-expression negli inizializzatori brace-or-equal per i membri di dati non statici (se presenti) è un'espressione costante (5.19),
- è un tipo di aggregazione (8.5.1) o ha almeno un costruttore di constexpr o modello di costruttore che non è un costruttore di copia o spostamento e
- tutti i suoi membri di dati non statici e le classi di base sono di non - tipi letterali volatili.
I punti di bonus;) per rispondere se
constexpr std::initializer_list<int> my_list = {1,2,3,4,5};
è legale (con i riferimenti). Anche se penso che questo è coperto da quanto detto sopra + [dcl.init.list]/5
Solo per ripetere quello che ho detto nella chat: non ho davvero il merito di fare 'std :: initializer_list' funzioni' constexpr' (N3741) se non possiamo legalmente scrivere l'ultimo esempio. – Morwenn