需要澄清文字类型的定义

Need clarification on definition of literal type

本文关键字:类型 定义 文字      更新时间:2023-10-16

我正在读的书经常提到,在某些情况下,类型必须是字面类型,例如可以使用constexpr的类型。但给出的唯一定义是,文字类型是算术、引用或指针类型。但是,当我们定义constexpr类型时,它似乎必须用文字或最初用文字初始化的变量来初始化。

我对什么是字面类型和什么不是字面类型感到困惑。

来自C++11,3.9/10:

一个类型是文字类型,如果它是:

  • 标量类型;或
  • 参考类型;或
  • 文字类型的数组;或
  • 具有以下所有属性的类类型(第9条):
    • 它有一个琐碎的析构函数
    • 大括号中的每个构造函数调用和完整表达式或非静态数据成员(如果有的话)的相等初始值设定项都是常量表达式(5.19)
    • 它是聚合类型(8.5.1),或者至少有一个constexpr构造函数或构造函数模板不是复制或移动构造函数,并且
    • 它的所有非静态数据成员和基类都是文本类型

因此,基本上它要么是引用,要么是基元对象类型,或者可以用constexpr类型的方式从文字类型构建的东西(数组、聚合或带有constexpr构造函数的类)。

C++11(n3485),[基本类型]9-10

算术类型、枚举类型、指针类型、指向成员类型的指针、std::nullptr_t和这些类型的cv限定版本统称为标量类型[…]

一个类型是文字类型,如果它是:

  • 标量类型;或
  • 参考类型;或
  • 文字类型的数组;或
  • 具有以下所有属性的类类型:
    • 它有一个琐碎的析构函数
    • 大括号中的每个构造函数调用和完整表达式或非静态数据成员(如果有的话)的相等初始值设定项都是常量表达式
    • 它是聚合类型,或者至少有一个constexpr构造函数或构造函数模板不是复制或移动构造函数,并且
    • 它的所有非静态数据成员和基类都是非易失性文本类型

[dcl.init.agr]/1

聚合是一个数组或类,没有用户提供的构造函数,没有用于非静态数据成员的大括号或相等的初始化器,没有私有或受保护的非静态数据会员,没有基类,也没有虚拟函数。