std::weak_order
來自 cppreference.com
定義於標頭檔案 <compare> |
||
inline namespace /* unspecified */ { inline constexpr /* unspecified */ weak_order = /* unspecified */; |
(C++20 起) | |
呼叫簽名 (Call signature) |
||
template< class T, class U > requires /* 見下文 */ |
||
使用三路比較對兩個值進行比較,併產生型別為 std::weak_ordering
的結果。
令 t 和 u 為表示式,T
和 U
分別表示 decltype((t)) 和 decltype((u)),std::weak_order(t, u) 等價於
- 若 std::is_same_v<std::decay_t<T>, std::decay_t<U>> 為 true
- std::weak_ordering(weak_order(t, u)),如果它是良好形式的表示式,且在不包含
std::weak_order
宣告的語境中執行了過載決議, - 否則,如果
T
是浮點型別- 若 std::numeric_limits<T>::is_iec559 為 true,則執行浮點值的弱序比較(見下文),並以
std::weak_ordering
型別的值返回結果, - 否則,產生一個
std::weak_ordering
型別的值,它與T
的比較運算子觀察到的順序一致,
- 若 std::numeric_limits<T>::is_iec559 為 true,則執行浮點值的弱序比較(見下文),並以
- 否則,std::weak_ordering(std::compare_three_way()(t, u)),如果它良好形式,
- 否則,std::weak_ordering(std::strong_order(t, u)),如果它良好形式。
- std::weak_ordering(weak_order(t, u)),如果它是良好形式的表示式,且在不包含
- 在所有其他情況下,該表示式格式錯誤,當它出現在模板例項化的直接上下文中時,可能導致 替換失敗。
目錄 |
自定義點物件
名稱 std::weak_order
指示一個*定製點物件*,它是一個 字面量 semiregular
類型別的 const 函式物件。為便於闡述,其型別的 cv-unqualified 版本表示為 __weak_order_fn
。
__weak_order_fn
的所有例項都相等。在相同引數上呼叫不同型別的 __weak_order_fn
例項的效果是等價的,無論表示例項的表示式是左值還是右值,以及是否為 const 限定(但是,volatile 限定的例項不需要可呼叫)。因此,std::weak_order
可以自由複製,並且其副本可以互換使用。
給定一組型別 Args...
,若 std::declval<Args>()... 滿足上述 std::weak_order
引數的要求,則 __weak_order_fn
滿足
- std::invocable<__weak_order_fn, Args...>,
- std::invocable<const __weak_order_fn, Args...>,
- std::invocable<__weak_order_fn&, Args...>,以及
- std::invocable<const __weak_order_fn&, Args...>.
否則,__weak_order_fn
的任何函式呼叫運算子都不參與過載決議。
[編輯] IEEE 浮點型別的嚴格弱序
令 x 和 y 是相同 IEEE 浮點型別的值,weak_order_less(x, y) 是一個布林結果,指示 x 是否在 C++ 標準定義的嚴格弱序中先於 y。
- 若 x 和 y 都不是 NaN,則 weak_order_less(x, y) == true 當且僅當 x < y,即所有表示相同浮點值的表示都等價;
- 若 x 是負 NaN 且 y 不是負 NaN,則 weak_order_less(x, y) == true;
- 若 x 不是正 NaN 且 y 是正 NaN,則 weak_order_less(x, y) == true;
- 若 x 和 y 都是同符號的 NaN,則 (weak_order_less(x, y) || weak_order_less(y, x)) == false,即所有同符號的 NaN 都等價。
[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 參閱
(C++20) |
支援所有6個運算子但不可替換的三路比較的結果型別 (類) |
(C++20) |
執行三向比較並生成型別為 std::strong_ordering 的結果(定製點物件) |
(C++20) |
執行三路比較併產生 std::partial_ordering 型別的結果(定製點物件) |
(C++20) |
執行三路比較併產生 std::weak_ordering 型別的結果,即使 operator<=> 不可用(定製點物件) |