Namespaces
Variants

C++ named requirements: BooleanTestable

From cppreference.net
C++ named requirements

指定该类型的表达式及其值类别可转换为 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 ) ) 满足 boolean-testable 概念时,表达式 e 的类型与值类别满足 BooleanTestable 要求。

(since C++20)

符合 BooleanTestable 要求的类型示例(可具有任意值类别)包括 bool std::true_type (C++11 起) std:: bitset < N > :: reference 以及 int *

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 2114
( P2167R3 )
C++98 bool 的可转换性要求过弱,无法反映实现方案的预期 强化了要求规范

参见

 (C++20)
指定类型可用于布尔上下文
( 仅用于说明的概念* )