C++ 具名要求:可布尔测试 (BooleanTestable)

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

指定拥有该值类型与值类别的表达式可转换为 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)) 实现 boolean-testable

(C++20 起)

可布尔测试 (BooleanTestable) 类型(可为任何值类别)的例子包括 boolstd::true_type (C++11 起)std::bitset<N>::referenceint*

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 2114
(P2167R3)
C++98 bool 的可转换性过于弱而无法反映实现的期待 加强要求

参阅

 (C++20)
指定能用于布尔语境的类型
(仅用于阐述的概念*)