在C++14中,void是一个文字类型。
如果类型是文字类型,那么它就是文字类型: -无效;或 -标量类型;或 -参考类型;或 -文字类型数组;或 -具有以下所有属性的类类型(第9条):-它有一个平凡的析构函数, -它是一个聚合类型(8.5.1),或者至少有一个constexpr构造函数或构造函数模板,而不是复制或移动构造函数,以及 -它的所有非静态数据成员和基类都是非易失文字类型.
在C++11中,void不是文字类型。
如果类型是文字类型,那么它就是文字类型: -标量类型;或 -指文字类型的参考类型;或 -文字类型数组;或 -具有以下所有属性的类类型(第9条):-它有一个平凡的析构函数, -非静态数据成员(如果有的话)的大括号或相等初始化器中的每个构造函数调用和完整表达式都是一个常量表达式(5.19), -它是一个聚合类型(8.5.1),或者至少有一个constexpr构造函数或构造函数模板,而不是复制或移动构造函数,以及 -它的所有非静态数据成员和基类都是文字类型。
那么,为什么void是一个文字类型呢?它有什么好处?
发布于 2014-12-15 14:48:24
由于void是literal 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();
}
};https://stackoverflow.com/questions/27486581
复制相似问题