作为在讨论这个 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) 或至少有一个不是复制或移动构造函数的 constexpr 构造函数或构造函数模板,并且
- 它的所有非静态数据成员和基类都是非易失性文字类型。
奖励积分;)回答如果
constexpr std::initializer_list<int> my_list = {1,2,3,4,5};
是合法的(有参考)。虽然我认为以上内容涵盖了这一点 + [dcl.init.list]/5