dyp*_*dyp 20 c++ initializer-list language-lawyer constexpr c++11
作为在讨论这个SO问题时提出的一个问题:
申报对象是否合法,可能是N3471constexpr std::initializer_list?例:
constexpr std::initializer_list<int> my_list{};
Run Code Online (Sandbox Code Playgroud)
为什么我认为它可能不合法: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};
Run Code Online (Sandbox Code Playgroud)
是合法的(有参考).虽然我认为上述+ [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.附注:constexpr在常量初始化 [basic.start.init]/2] 期间,可以初始化具有ctor 的非文字类型的对象(静态初始化的一部分,在任何动态初始化之前执行).
| 归档时间: |
|
| 查看次数: |
6173 次 |
| 最近记录: |