C++ 名前付き要件: BooleanTestable
From cppreference.com
そのような型と値カテゴリの式の bool への変換可能性、およびその型または2つの異なる BooleanTestable 型に対する論理演算子が通常の動作(短絡評価を含む)をすることを示します。
目次 |
[編集] 要件
ある型と値カテゴリの式を e とします。型と値カテゴリが BooleanTestable 要件を満たすのは、次の条件を満たす場合です。
- !e が、もしあれば、e が示すオブジェクトを変更せずに、well-formedであることただし、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)) が |
(C++20以降) |
BooleanTestable 型(任意の値カテゴリを持つ)の例としては、bool、std::true_type(C++11以降)、std::bitset<N>::reference、および int* があります。
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2114 (P2167R3) |
C++98 | bool への変換可能性は、実装の期待を反映するには弱すぎた | 要件が強化された |
[編集] 関連項目
| (C++20) |
型が真偽値コンテキストで使用可能であることを規定する (提示専用コンセプト*) |