需要澄清文字类型的定义

时间:2013-09-02 22:15:13

标签: c++

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

我对符合文字类型的内容感到困惑,并且没有。

2 个答案:

答案 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 ,没有私有或者受保护的非静态数据成员,没有基类,也没有虚函数。