Namespaces
Variants

C++ named requirements: BooleanTestable

From cppreference.net
C++ named requirements

その型と値カテゴリの式が bool に変換可能であり、かつその型または2つの異なる BooleanTestable 型に対する論理演算子が通常の振る舞い( 短絡評価 を含む)を持つことを指定します。

目次

要件

e を特定の型と値カテゴリを持つ式とする。その型と値カテゴリが BooleanTestable 要件を満たすのは以下の場合である:

  • ! e は整形式であり、存在する場合 e で示されるオブジェクトを変更しない 。ただし、 e がxvalueの場合、示されるオブジェクトは有効だが未規定の状態に残される可能性がある (C++11以降)
  • e および ! e は両方とも、 暗黙変換 static_cast の両方によって bool に変換可能である。
  • 両方の方法による変換は同等の結果を生成し、存在する場合ソースオブジェクトを変更しない 。ただし、 e または ! e がxvalueの場合、ソースオブジェクトは有効だが未規定の状態に残される可能性がある (C++11以降)
  • bool ( ! e ) == ! bool ( e ) が成り立つ。
  • e または ! e の型に対して、 実引数依存の名前探索 によって可視な非メンバー operator && および operator || は存在しない。
  • 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 型の例(任意の値カテゴリを持つ)には、 bool std::true_type (C++11以降) std:: bitset < N > :: reference 、および int * が含まれます。

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2114
( P2167R3 )
C++98 bool への変換可能性が実装の期待を反映するには弱すぎた 要件を強化

関連項目

 (C++20)
型がブーリアンコンテキストで使用できることを指定する
( exposition-only concept* )