Namespaces
Variants

std::experimental::ranges:: Boolean

From cppreference.net
template < class B >

concept bool Boolean =
Movable < std:: decay_t < B >> &&
requires ( const std:: remove_reference_t < B > & b1,
const std:: remove_reference_t < B > & b2, const bool a ) {
{ b1 } - > ConvertibleTo < bool > && ;
{ ! b1 } - > ConvertibleTo < bool > && ;
{ b1 && a } - > Same < bool > && ;
{ b1 || a } - > Same < bool > && ;
{ b1 && b2 } - > Same < bool > && ;
{ a && b2 } - > Same < bool > && ;
{ b1 || b2 } - > Same < bool > && ;
{ a || b2 } - > Same < bool > && ;
{ b1 == b2 } - > ConvertibleTo < bool > && ;
{ b1 == a } - > ConvertibleTo < bool > && ;
{ a == b2 } - > ConvertibleTo < bool > && ;
{ b1 ! = b2 } - > ConvertibleTo < bool > && ;
{ b1 ! = a } - > ConvertibleTo < bool > && ;
{ a ! = b2 } - > ConvertibleTo < bool > && ;

} ;
(范围 TS)

概念 Boolean<B> 规定了可在布尔上下文中使用的类型所需满足的要求。要满足 Boolean 要求,逻辑运算符必须具有常规行为(包括短路求值)。更准确地说,给定

Boolean<B> 仅在以下条件满足时成立:

  • bool ( b1 ) == ! bool ( ! b1 )
  • b1 && b2 b1 && bool ( b2 ) bool ( b1 ) && b2 均等价于 bool ( b1 ) && bool ( b2 ) ,且具有相同的短路求值特性;
  • b1 || b2 b1 || bool ( b2 ) bool ( b1 ) || b2 均等价于 bool ( b1 ) || bool ( b2 ) ,且具有相同的短路求值特性;
  • bool ( b1 == b2 ) bool ( b1 == bool ( b2 ) ) bool ( bool ( b1 ) == b2 ) 均等价于 ( bool ( b1 ) == bool ( b2 ) )
  • bool ( b1 ! = b2 ) bool ( b1 ! = bool ( b2 ) ) bool ( bool ( b1 ) ! = b2 ) 均等价于 ( bool ( b1 ) ! = bool ( b2 ) )

等值保持性

表达式若在给定相等输入时产生相等输出,则称其具有 等值保持性

  • 表达式的输入由其操作数构成。
  • 表达式的输出由其结果及所有被该表达式修改的操作数(如有)构成。

每个要求保持相等性的表达式还必须满足 稳定性 要求:对此类表达式进行两次求值,若输入对象相同,则输出结果必须相等,除非其间显式修改了这些输入对象。

除非另有说明,每个在 要求表达式 中使用的表达式都必须保持相等性且稳定,且该表达式的求值只能修改其非常量操作数。常量操作数不得被修改。

隐式表达式变体

一个使用对某个常量左值操作数进行非修改性表达式的 requires-expression ,也会隐式要求接受该操作数的非常量左值或(可能为常量的)右值的该表达式的额外变体,除非这样的表达式变体已通过具有不同语义的方式被显式要求。这些 隐式表达式变体 必须满足所声明表达式的相同语义要求。实现对这些变体语法验证的程度是未指定的。

注释

布尔类型的示例包括 bool std:: true_type std:: bitset < N > :: reference 。指针不属于布尔类型。

形如 { expression } - > Same < T > && 的推导约束实际上要求 decltype ( ( expression ) ) && 必须与 T&& 完全相同的类型。这同时约束了表达式的类型及其值类别。