Void是一个字面类型?

use*_*611 14 c++ c++11 c++14

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

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

- 无效; 要么

- 标量类型; 要么

- 参考类型; 要么

- 一个文字类型的数组; 要么

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

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

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

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

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

- 标量类型; 要么

- 引用文字类型的引用类型; 要么

- 一个文字类型的数组; 要么

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

- 非静态数据成员(如果有)的brace-or-equal-initializers中的每个构造函数调用和完全表达式都是一个常量表达式(5.19),

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

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

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

For*_*veR 18

由于voidIS literal type,constexpr函数可以具有返回类型void在C++ 14.

它在本提案中有所涉及.

提案引用:

允许任意表达式语句,以允许调用执行检查的函数并允许类似断言的构造.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();
  }
};
Run Code Online (Sandbox Code Playgroud)