空作为文本类型
Void as a literal type?
在 C++14 中,void
是文字类型
如果类型是以下类型,则类型为文本类型:
— 无效;或
— 标量类型;或
— 引用类型;或
— 文字类型的数组;或
—具有以下所有属性的类类型(条款 9(: — 它有一个微不足道的析构函数,
— 它是一个聚合类型 (8.5.1( 或至少有一个 constexpr 不是副本或移动的构造函数或构造函数模板 构造函数,以及
— 它的所有非静态数据成员和基类都是 非易失性文本类型。
在 C++11 中,void
不是文字类型
如果类型是以下类型,则类型为文本类型:
— 标量类型;或
— 引用文本类型的引用类型;或
— 文字类型的数组;或
—具有以下所有属性的类类型(条款 9(: — 它有一个微不足道的析构函数,
— 每个构造函数调用和完整表达式在 非静态数据成员(如果有(的大括号或等号初始值设定项是一个 常量表达式 (5.19(,
— 它是一个聚合类型 (8.5.1( 或至少有一个 constexpr 不是副本或移动的构造函数或构造函数模板 构造函数,以及
— 它的所有非静态数据成员和基类都是文字的 类型。
那么为什么void
是文字类型呢?它有什么好处?
因为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();
}
};
相关文章:
- CRTP 单一实例不完整类型或非文本类型
- 如何从文本文件中读取数值,直到遇到字符类型?
- 如何将文本文件的特定行读取到 int 类型的数组中C++?
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类
- 是否可以创建一个用户定义的文本,将字符串文本转换为 own 类型的数组?
- 如何使用C++将.trc文件类型转换为文本文件?
- 整数文本太大,无法用任何整数类型表示--C++
- 具有引用数据成员的结构不是文本类型吗?
- 指针类型是文本类型吗?
- FindResource 调用返回 RCDATA 类型的文本文件的 NULL
- 文本类类型成员函数约束
- 当浮点数文本直接分配给不同的类型时,编译器如何处理浮点文字?
- 如何在自由类型中获取文本宽度
- 常量表达式中的非文本类型'compare'
- C++文本整数类型
- 运行时文本类型的惊人行为
- 在C 中按行读取文本文件,每行都是不同的数据类型
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- (视觉-)C++ 字符串文本的模板类型推断 - VS 2010 与 VS 2017
- QString:包括非文本类型的静态数据成员的初始化