首頁 >後端開發 >C++ >為什麼自訂 `spaceship` 運算子在 C 20 中不產生 `==` 和 `!=` 運算子?

為什麼自訂 `spaceship` 運算子在 C 20 中不產生 `==` 和 `!=` 運算子?

Patricia Arquette
Patricia Arquette原創
2024-11-07 05:35:02389瀏覽

Why Doesn't a Custom `spaceship` Operator Generate `==` and `!=` Operators in C  20?

非預設運算子以及== 和!= 的缺失

在C 20 中,新引入的太空船運算符() 引發了一些有關== 和!= 運算子產生的意外行為。使用者在使用具有自訂實作的非預設 spaceship 運算子時可能會遇到編譯錯誤。

預設情況下,spaceship 運算子會比較給定類型的兩個物件。如果類別沒有明確定義 == 運算符,但定義了預設的非預設 spaceship 運算符,則編譯器將自動產生 == 運算符,其存取權限與 spaceship 運算符相同。這種行為在語言標準 [class.compare.default] 中指定,確保像 std::vector 這樣的類別不會使用非預設的太空船運算子進行相等性測試。

但是,如果太空船運算子不是預設(即,它有自訂實作),編譯器將不會產生 == 運算子。這是因為定義自訂太空船運算符的類別可能需要 == 的專門實作來處理特定的比較場景。因此,語言將其留給程式設計師在需要時明確定義 == 運算子。

例如,考慮以下程式碼:

#include <compare>

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&) const = default; // Default implementation
};

此程式碼編譯成功,因為太空船運算子是預設的,編譯器會產生 == 運算子。但是,如果我們將 spaceship 運算子變更為自訂實作:

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&amp; other) const
    {
        return Dummy <=> other.Dummy;
    }
};

程式碼現在將無法編譯,並出現錯誤,指示未為類別 X 定義 == 運算子。這是因為修改後的 spaceship 運算子不是預設的,編譯器不會自動產生 == 運算子。在這種情況下,使用者需要明確定義 == 運算子來滿足其自訂類別的比較需求。

以上是為什麼自訂 `spaceship` 運算子在 C 20 中不產生 `==` 和 `!=` 運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn