C++ 具名要求:可布尔测试 (BooleanTestable)
来自cppreference.com
指定拥有该值类型与值类别的表达式可转换为 bool 并且逻辑运算符对该类型或二个不同的可布尔测试 (BooleanTestable) 类型拥有通常行为(包括短路)。
要求
令 e 为拥有具体类型与值类别的表达式。如果下列条件成立,则该类型与值类别符合可布尔测试 (BooleanTestable) 要求:
- !e 良构并不修改 e 所指代的对象,若对象存在,除了若 e 为亡值,则被指代的对象能被置于合法但未指定的状态 (C++11 起)。
- e 与 !e 均可由隐式转换和 static_cast 转换为 bool。
- 以两种方式进行的转换产生相等的结果并且不修改源对象,若源对象存在,除了如果 e 或 !e 为亡值,则源对象能被置于合法但未指定的状态 (C++11 起)。
- bool(!e) == !bool(e) 成立。
- 没有可行的非成员 operator&& 或 operator|| 重载对 e 或 !e 的类型所做的实参依赖查找可见。
- 如果 e 或 !e 拥有类类型,则该类不定义任何成员 operator&& 或 operator||。
注解
标准不提供拥有此名字的具名要求。它最初作为 LWG2114 的早期解决方案提供,但在最终解决方案 P2167R3 中被仅用于阐述的概念 boolean-testable
取代。由于实现通常在 C++20 之前的模式中也期待类型实现 boolean-testable
,我们有意将 P2167R3 当作缺陷报告并将 boolean-testable
变换为旧式的具名要求。
在将 &&
与 ||
运算符用于类型与值类别为可布尔测试 (BooleanTestable) 的操作数时,内建版本得到选择并进行短路求值。
表达式 e 的类型与值类别符合可布尔测试 (BooleanTestable) 要求当且仅当 decltype((e)) 实现 |
(C++20 起) |
可布尔测试 (BooleanTestable) 类型(可为任何值类别)的例子包括 bool、std::true_type (C++11 起)、std::bitset<N>::reference 及 int*。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2114 (P2167R3) |
C++98 | 到 bool 的可转换性过于弱而无法反映实现的期待 | 加强要求 |
参阅
(C++20) |
指定能用于布尔语境的类型 (仅用于阐述的概念*) |