このSOの質問の議論中に出てきた質問として:
おそらくN3471constexpr 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) であるか、またはコピーまたは移動コンストラクターではない少なくとも 1 つの constexpr コンストラクターまたはコンストラクター テンプレートを持ち、かつ
- その非静的データ メンバーと基本クラスはすべて、非揮発性リテラル型です。
ボーナスポイント;)
constexpr std::initializer_list<int> my_list = {1,2,3,4,5};
合法です(参照あり)。これは上記の+ [dcl.init.list]/5でカバーされていると思いますが