29

作为在讨论这个 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

4

1 回答 1

11

更新:在CWG DR 1684的决议删除了下面引用的要求后,情况变得更加复杂。更多信息可以在关于 std-discussion 邮件列表的讨论中找到,以及相关问题Why is not `std::initializer_list` defined as a literal type?


[decl.constexpr]/8:

非构造函数的非静态成员函数的 constexpr 说明符将该成员函数声明为 const (9.3.1)。[...] 该函数所属的类应为文字类型(3.9)。

因此,N3471 保证的变化std::initializer_list将是一个字面量类型。


请注意,constexpr单独的 ctor 不需要std::initializer_list是文字类型,请参阅 [dcl.constexpr]/4+8。旁注:constexpr可以在常量初始化[basic.start.init]/2] 期间初始化具有 ctor 的非文字类型的对象(静态初始化的一部分,在任何动态初始化之前执行)。

于 2013-04-17T18:25:49.047 回答