需要澄清文字类型的定义
Need clarification on definition of literal type
我正在读的书经常提到,在某些情况下,类型必须是字面类型,例如可以使用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
聚合是一个数组或类,没有用户提供的构造函数,没有用于非静态数据成员的大括号或相等的初始化器,没有私有或受保护的非静态数据会员,没有基类,也没有虚拟函数。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 列表参数的类型定义
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 关于 C++ 中的函数类型定义
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 将使用/类型定义限制为类范围
- 模板类型定义?
- C++:模板类的类型定义
- 如何对命名空间限定类型进行类型定义?
- 此递归模板类型定义是否有效C++?
- 具有调整对齐方式的类型定义
- C++从抽象类型定义类成员
- 用于C++代码的 API 监视器类型定义 (XML)
- 如何将result_of与函数类型定义一起使用
- 在C++的适当类型定义位置
- 如何根据模板类型定义浮点常量?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 参数化类的别名(或类型定义)内部类
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?