空作为文本类型

Void as a literal type?

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

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

如果类型是以下类型,则类型为文本类型:

— 无效;或

— 标量类型;或

— 引用类型;或

— 文字类型的数组;或

具有以下所有属性的类类型(条款 9(: — 它有一个微不足道的析构函数,

— 它是一个聚合类型 (8.5.1( 或至少有一个 constexpr 不是副本或移动的构造函数或构造函数模板 构造函数,以及

— 它的所有非静态数据成员和基类都是 非易失性文本类型。

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

如果类型是以下类型,则类型为文本类型:

— 标量类型;或

— 引用文本类型的引用类型;或

— 文字类型的数组;或

具有以下所有属性的类类型(条款 9(: — 它有一个微不足道的析构函数,

— 每个构造函数调用和完整表达式在 非静态数据成员(如果有(的大括号或等号初始值设定项是一个 常量表达式 (5.19(,

— 它是一个聚合类型 (8.5.1( 或至少有一个 constexpr 不是副本或移动的构造函数或构造函数模板 构造函数,以及

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

那么为什么void是文字类型呢?它有什么好处?

因为voidliteral type的,constexpr函数可以在C++14中返回类型void

它涵盖了在这个提案中。

提案引述:

允许

使用任意表达式语句,以便允许 调用执行检查的函数并允许类似断言 构建。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();
  }
};