非預設運算子以及== 和!= 的缺失
在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& other) const { return Dummy <=> other.Dummy; } };
程式碼現在將無法編譯,並出現錯誤,指示未為類別 X 定義 == 運算子。這是因為修改後的 spaceship 運算子不是預設的,編譯器不會自動產生 == 運算子。在這種情況下,使用者需要明確定義 == 運算子來滿足其自訂類別的比較需求。
以上是為什麼自訂 `spaceship` 運算子在 C 20 中不產生 `==` 和 `!=` 運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!