在C 20 中使用新的spaceship 運算子() 時,重要的是要注意實作自訂運算子與依賴預設實作的含義。
在第一個範例中,您使用的是預設運算子;語言提供的實作。此預設實作允許編譯器自動產生 == 運算子。但是,當您實作自訂運算子時,函數時,編譯器無法再隱式產生對應的 == 運算子。
這種行為是有意為之,如C 標準所述([class.compare.default](https://en.cppreference.com /w/cpp/language/comparison#Class_comparison)) :
If the class definition does not explicitly declare an == operator function, but declares a defaulted three-way comparison operator function, an == operator function is declared implicitly with the same access as the three-way comparison operator function.
這種設計選擇背後的原因是為了防止在可能不是最有效的確定方法的情況下隱式生成==平等。例如,像 std::vector 這樣的類別不應使用非預設的 。用於相等測試,因為首先比較大小更有效。
在自訂 中實作時,該類別可能正在執行專門的操作,這些操作也需要 == 的自訂實作。因此,該語言不會產生潛在的非最佳預設實現,而是讓程式設計師明確定義 == 運算子。
以上是為什麼非預設的 Spaceship 運算子在 C 20 中不產生 `==` 和 `!=`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!