在C ++ 14 void
是一个文字类型
类型是文字类型,如果它是:
- 无效;或
- 标量类型;或
- 参考类型;或
- 一个文字类型的数组;或
- 具有以下所有属性的类类型(第9条): - 它有一个简单的析构函数,
- 它是聚合类型(8.5.1)或至少有一个constexpr 不是复制或移动的构造函数或构造函数模板 构造函数和
- 所有非静态数据成员和基类都是 非易失性文字类型。
在C ++ 11中void
不是文字类型
类型是文字类型,如果它是:
- 标量类型;或
- 引用文字类型的引用类型;或
- 一个文字类型的数组;或
- 具有以下所有属性的类类型(第9条): - 它有一个简单的析构函数,
- 每个构造函数调用和完整表达式 用于非静态数据成员(如果有的话)的大括号或者等于初始值的是 常数表达式(5.19),
- 它是聚合类型(8.5.1)或至少有一个constexpr 不是复制或移动的构造函数或构造函数模板 构造函数和
- 它的所有非静态数据成员和基类都是文字的 类型。
那么为什么void
是文字类型?它提供了哪些好处?
答案 0 :(得分:18)
由于void
是literal type
,constexpr
函数可以在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();
}
};