std::experimental::ranges:: Boolean
|
template
<
class
B
>
concept
bool
Boolean
=
|
(ranges TS) | |
Boolean<B>
の概念は、ブーリアンコンテキストで使用可能な型の要件を定義します。
Boolean
が満たされるためには、論理演算子が通常の動作(ショートサーキットを含む)を持たなければなりません。より正確には、以下が与えられた場合
-
b1,b2, 型 const std:: remove_reference_t < B > の2つの左辺値,
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 ) ) と等しい。
等価性保存
式は、等しい入力が与えられた場合に等しい出力をもたらす場合、 equality preserving であると言います。
- 式への入力は、そのオペランドで構成されます。
- 式からの出力は、その結果と、式によって変更されたすべてのオペランド(存在する場合)で構成されます。
等価性を保持することが要求されるすべての式は、さらに stable(安定性) が要求されます:同じ入力オブジェクトに対するそのような式の2回の評価は、それらの入力オブジェクトに対する明示的な変更がない限り、等しい出力を持たなければなりません。
特に明記されていない限り、 requires式 で使用される各式は、等価性を保存し安定していることが要求され、式の評価は非定数オペランドのみを変更できます。定数オペランドは変更してはなりません。
暗黙的な式のバリエーション
requires-expression は、特定の定数左辺値オペランドに対して非変更的な式を使用する場合、そのオペランドに対して非定数左辺値または(場合によっては定数の)右辺値を受け入れる式の追加バリエーションも暗黙的に要求します。ただし、異なるセマンティクスを持つ式バリエーションが明示的に要求されている場合は除きます。これらの implicit expression variations は、宣言された式と同じセマンティック要件を満たさなければなりません。実装がこれらのバリエーションの構文をどこまで検証するかは未規定です。
注記
Boolean
型の例には、
bool
、
std::
true_type
、および
std::
bitset
<
N
>
::
reference
が含まれます。ポインタは
Boolean
型ではありません。
形式
{
expression
}
-
>
Same
<
T
>
&&
の導出制約は、実質的に
decltype
(
(
expression
)
)
&&
が
T&&
と完全に同じ型であることを要求します。これは式の型とその値カテゴリの両方を制約します。