std::boolean
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <concepts> で定義
|
||
template<class B> concept boolean = std::movable<std::remove_cvref_t<B>> && requires(const std::remove_reference_t<B>& b1, const std::remove_reference_t<B>& b2, const bool a) { { b1 } -> std::convertible_to<bool>; { !b1 } -> std::convertible_to<bool>; { b1 && b2 } -> std::same_as<bool>; { b1 && a } -> std::same_as<bool>; { a && b2 } -> std::same_as<bool>; { b1 || b2 } -> std::same_as<bool>; { b1 || a } -> std::same_as<bool>; { a || b2 } -> std::same_as<bool>; { b1 == b2 } -> std::convertible_to<bool>; { b1 == a } -> std::convertible_to<bool>; { a == b2 } -> std::convertible_to<bool>; { b1 != b2 } -> std::convertible_to<bool>; { b1 != a } -> std::convertible_to<bool>; { a != b2 } -> std::convertible_to<bool>; }; |
(C++20以上) | |
コンセプト boolean<B> はブーリアンの文脈で使用可能な型のための要件を指定します。 boolean が満たされるためには、論理演算子が通常の動作 (短絡評価を含む) を持たなければなりません。 より正確には、
const std::remove_reference_t<B>型の2つの左辺値b1,b2
が与えられたとき、以下の内容を満たす場合にのみ 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))と等しい。
等しさの維持
等しい入力を与えると等しい出力が得られる場合、その式は等しさを維持します。
- 式への入力がその被演算子から構成される。
- 式の出力がその結果およびその式によって変更されるすべての被演算子 (もしあれば) から構成される。
等しさを維持することが要求されるすべての式は、さらに安定であることも要求されます。 同じ入力オブジェクトを用いたそのような式の2回の評価は、間にそれらの入力オブジェクトの変更が明示的に挟まれなければ、等しい出力が得られなければなりません。
特に明記されない限り、 requires 式で使用されるすべての式は、等しさを維持することと安定であることが要求され、式の評価は非定数の被演算子のみを変更することができます。 定数である被演算子は変更してはなりません。
暗黙の式のバリエーション
何らかの定数左辺値の被演算子に対して変更しない式を使用する requires 式は、そのような式のバリエーションが異なるセマンティクスで明示的に要求されなければ、与えられた被演算子に対して非定数左辺値または (定数かもしれない) 右辺値を受理するその式の追加のバリエーションも暗黙に要求します。 これらの暗黙の式のバリエーションは、宣言された式のセマンティクスの要件を満たさなければなりません。 処理系がバリエーションの構文を検証する範囲は未規定です。
ノート
boolean な型の例としては bool、 std::true_type および std::bitset<N>::reference があります。 ポインタは Boolean ではありません。