【问题标题】:Void as a literal type?void 作为文字类型?
【发布时间】:2014-12-15 14:44:47
【问题描述】:

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

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

——无效;或

——标量类型;或

——引用类型;或

——文字类型的数组;或

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

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

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

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

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

——标量类型;或

——引用类型,引用文字类型;或

——文字类型的数组;或

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

— 中的每个构造函数调用和完整表达式 非静态数据成员(如果有)的大括号或相等初始化器是 常量表达式(5.19),

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

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

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

【问题讨论】:

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


【解决方案1】:

由于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();
  }
};

【讨论】:

  • 在 C++14 中,可以声明/返回 void 变量吗?显然,它本身并不是有用的,也无法访问,但对于通用/模板代码,它有时可以简化事情。
猜你喜欢
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2018-02-01
  • 2022-01-06
  • 2017-11-19
相关资源
最近更新 更多