C++ 命名要求: BooleanTestable
來自 cppreference.com
指定此類型別和值類別的表示式可轉換為 bool,並且該型別或兩種不同的 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)) 建模 |
(C++20 起) |
BooleanTestable 型別(具有任何值類別)的示例包括 bool、std::true_type(C++11 起)、std::bitset<N>::reference 和 int*。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2114 (P2167R3) |
C++98 | 可轉換為 bool 對於反映實現的期望來說太弱了 | 要求已加強 |
[編輯] 參閱
(C++20) |
指定型別可以在布林上下文中使用 (僅用於闡述的概念*) |