繁体   English   中英

声明constexpr initializer_list对象是否合法?

[英]Is it legal to declare a constexpr initializer_list object?

作为在讨论这个SO问题时提出的一个问题

声明constexpr std::initializer_list对象是否合法(可能是N3471) 例:

constexpr std::initializer_list<int> my_list{};

为什么我认为它可能不合法: initializer_list必须是文字类型; 但有没有保证它是文字类型?

来自N3485的引文。

[dcl.constexpr] / 9:

对象声明中使用的constexpr说明符将对象声明为const。 这样的对象应具有文字类型并应初始化。

文字类型要求,[basic.types] / 10,子项目类类型:

  • 具有以下所有属性的类类型(第9节):
    • 它有一个简单的析构函数,
    • 非静态数据成员(如果有)的brace-or-equal-initializers中的每个构造函数调用和完全表达式都是一个常量表达式(5.19),
    • 它是一个聚合类型(8.5.1)或者至少有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
    • 它的所有非静态数据成员和基类都是非易失性文字类型。

奖励积分;)用于回答if

constexpr std::initializer_list<int> my_list = {1,2,3,4,5};

是合法的(有参考)。 虽然我认为上述+ [dcl.init.list] / 5涵盖了这一点

更新:CWG DR 1684的解决方案取消了下面引用的要求后,情况变得更加复杂。 在std-discussion邮件列表和相关问题的讨论中可以找到更多信息为什么不将`std :: initializer_list`定义为文字类型?


[decl.constexpr] / 8:

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

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM