Void是一个字面类型?

时间:2014-12-15 14:44:47

标签: c++ c++11 c++14

在C ++ 14 void是一个文字类型

  

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

     

- 无效;或

     

- 标量类型;或

     

- 参考类型;或

     

- 一个文字类型的数组;或

     

- 具有以下所有属性的类类型(第9条): -   它有一个简单的析构函数,

     

- 它是聚合类型(8.5.1)或至少有一个constexpr   不是复制或移动的构造函数或构造函数模板   构造函数和

     

- 所有非静态数据成员和基类都是   非易失性文字类型。

在C ++ 11中void不是文字类型

  

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

     

- 标量类型;或

     

- 引用文字类型的引用类型;或

     

- 一个文字类型的数组;或

     

- 具有以下所有属性的类类型(第9条): -   它有一个简单的析构函数,

     

- 每个构造函数调用和完整表达式   用于非静态数据成员(如果有的话)的大括号或者等于初始值的是   常数表达式(5.19),

     

- 它是聚合类型(8.5.1)或至少有一个constexpr   不是复制或移动的构造函数或构造函数模板   构造函数和

     

- 它的所有非静态数据成员和基类都是文字的   类型。

那么为什么void是文字类型?它提供了哪些好处?

1 个答案:

答案 0 :(得分:18)

由于voidliteral typeconstexpr函数可以在C ++ 14中返回类型void

It's covered in this proposal.

提案引用:

  

允许使用任意表达式语句   调用执行检查的函数并允许类似断言   结构体。 void也会成为文字类型,因此constexpr   仅用于执行此类检查的函数可能会返回void。

#define ASSERT(expr) \
  (void)((expr) || assert_failed(#expr, __LINE__, __FILE__))
void assert_failed(...); // not constexpr
struct S {
  std::array a<int, 100>;
  size_t i;

  constexpr void check_invariants() const {
    ASSERT(i < a.size());
    ASSERT(a[i] == 0);
  }
  S(std::array<int, 100> a_, size_t i_) : a(a_), i(i_) {
    check_invariants();
  }
};
相关问题