C++ named requirements: BooleanTestable
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
指定该类型的表达式及其值类别可转换为 bool ,且该类型的逻辑运算符或两个不同的 BooleanTestable 类型具有常规行为(包括 短路求值 )。
目录 |
要求
令 e 为具有特定类型和值类别的表达式。当满足以下条件时,该类型和值类别符合 BooleanTestable 要求:
- ! e 是良构的且不会修改由 e 指代的对象(如果存在) ,除非当 e 是亡值时,被指代的对象可能被置于有效但未指定的状态 (C++11 起) 。
- e 和 ! e 均可通过 隐式转换 和 static_cast 转换为 bool 。
- 两种转换方式产生相等结果且不会修改源对象(如果存在) ,除非当 e 或 ! e 是亡值时,源对象可能被置于有效但未指定的状态 (C++11 起) 。
- bool ( ! e ) == ! bool ( e ) 恒成立。
- 对于 e 或 ! e 的类型,通过 实参依赖查找 不可见任何可行的非成员 operator && 和 operator || 。
- 如果 e 或 ! e 是类类型,则该类未定义任何成员 operator && 或 operator || 。
注释
标准未定义以此命名的具名要求。它最初在
LWG2114
的早期决议中被提出,但最终被
P2167R3
决议中的仅用于阐述的概念
boolean-testable
所取代。由于实现通常期望提供的类型建模
boolean-testable
(即使在C++20之前的模式中),我们有意将P2167R3视为缺陷报告,并将
boolean-testable
转换为传统具名要求。
当
&&
和
||
运算符的操作数类型和值类别为
BooleanTestable
时,将选择内置版本并执行短路求值。
|
当且仅当
decltype
(
(
e
)
)
满足
|
(since C++20) |
符合 BooleanTestable 要求的类型示例(可具有任意值类别)包括 bool 、 std::true_type (C++11 起) 、 std:: bitset < N > :: reference 以及 int * 。
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
|
LWG 2114
( P2167R3 ) |
C++98 | 对 bool 的可转换性要求过弱,无法反映实现方案的预期 | 强化了要求规范 |
参见
|
(C++20)
|
指定类型可用于布尔上下文
( 仅用于说明的概念* ) |