是否合法声明constexpr initializer_list对象?(Is it legal to

2019-08-31 09:44发布

作为该讨论过程中提出了一个问题, 这太问题 :

它是合法的,可能与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覆盖

Answer 1:

更新:一发有点复杂后的分辨率CWG DR 1684取出下面引用的要求。 一些更多的信息可以发现本次讨论的STD-讨论邮件列表 ,并在相关的问题为什么不'的std :: initializer_list`定义为一个文本类型?


[decl.constexpr] / 8:

用于非静态成员函数不是一个构造甲constexpr说明符声明成员函数是const(9.3.1)。 [...]的类的其功能是一个成员应是文字型(3.9)。

因此,N3471担保变化std::initializer_list将是一个文本类型。


注意constexpr构造函数本身并不需要std::initializer_list是一个文本类型,见[dcl.constexpr] / 4 + 8。 边注:与非文字类型的对象constexpr构造函数可以恒定初始化 [basic.start.init] / 2]( 静态初始化的一部分,任何动态初始化之前执行)期间被初始化。



文章来源: Is it legal to declare a constexpr initializer_list object?