我经常阅读的书中提到,在某些情况下,类型必须是文字类型,例如可以使用constexpr的类型。但唯一给出的定义是文字类型是算术类型,引用类型或指针类型。但是当我们定义一个constexpr类型时,似乎必须使用最初用文字初始化的文字或变量进行初始化。
我对符合文字类型的内容感到困惑,并且没有。
答案 0 :(得分:12)
来自C ++ 11,3.9 / 10:
类型是文字类型,如果它是:
- 标量类型;或
- 参考类型;或
- 一个文字类型的数组;或
- 具有以下所有属性的类类型(第9条):
- 它有一个简单的析构函数,
- brace-or-equal-initializers 中的每个构造函数调用和完全表达式,用于非静态数据成员(如果有)是一个常量表达式(5.19),
- 它是一个聚合类型(8.5.1)或者至少有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
- 它的所有非静态数据成员和基类都是文字类型。
所以基本上它既可以是引用,也可以是原始对象类型,也可以是以constexpr方式从字面类型构造的(使用constexpr构造函数的数组,聚合或类)。
答案 1 :(得分:3)
C ++ 11(n3485),[basic.types] 9-10
算术类型,枚举类型,指针类型,指向成员类型的指针,
std::nullptr_t
和这些类型的cv限定版本统称为标量类型 [...]类型是文字类型,如果它是:
- 标量类型;或
- 参考类型;或
- 一个文字类型的数组;或
- 具有以下所有属性的类类型:
- 它有一个简单的析构函数,
- brace-or-equal-initializers 中的每个构造函数调用和完全表达式,用于非静态数据成员(如果有)是一个常量表达式,
- 它是聚合类型或至少有一个
constexpr
构造函数或构造函数模板,它不是复制或移动构造函数,- 它的所有非静态数据成员和基类都是非易失性文字类型。
[dcl.init.aggr] / 1
聚合是一个没有用户提供的构造函数的数组或类,没有用于非静态数据成员的 brace-or-equal-initializers ,没有私有或者受保护的非静态数据成员,没有基类,也没有虚函数。