簡體   English   中英

為什么 std::tuple 調用運算符 <=> 兩次?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM