[英]Why does std::tuple call operator <=> twice?
以下代碼調用運算符 <=> 兩次,其中 arguments 反轉。 但為什么?
GCC 10.2 和 clang 12 似乎都在使用 libstdc++-10,其 <tuple> 確實提供了運算符 <=>,所以這似乎不是缺少標准庫支持的情況,我的代碼一定是不正確的。 如何解決?
#include <tuple>
#include <compare>
#include <iostream>
struct X {
int i;
auto operator <=>(X const& other) const {
std::cout << this << " <=> " << &other << std::endl;
return i <=> other.i;
}
};
int main() {
std::tuple{X{42}} <=> std::tuple{X{42}};
}
簡短回答:您需要為X
定義operator==
。
std::tuple
通過綜合三路比較來比較元素,僅當類型滿足std::three_way_comparable_with<T,U>
時才使用<=>
。 最終,這需要std::three_way_comparable<X>
,這需要一個說明性的weakly-equality-comparable-with
概念。 正如您可能猜到的,這要求==
有效。
修復是一個單行:
bool operator==(X const& other) const = default;
現在,當<=>
似乎在這里自己完成這項工作時,為什么需要==
呢? 我只能推測,但這可能是由於概念比我們習慣的更“完整”,例如只需要operator<
。 如果一個類型可以與<=>
進行比較,那么它也應該支持相等。
至於為什么<=>
不單獨覆蓋==
除非默認,這是因為相等性可以短路的類(例如向量和字符串)以及包含此類類型的任何類的性能缺陷。 沒有跡象表明相等性比較每個元素而不是短路,因此<=>
不處理相等性,除非它可以保證您將避免該陷阱(通過默認<=>
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.