簡體   English   中英

將三路比較運算符的結果與 nullptr 進行比較有什么作用?

[英]What does comparing the result of the three-way comparison operator with nullptr do?

鑒於<=>上的 cppreference示例,我們可以將示例代碼簡化為:

struct person {
    std::string name;
    std::string surname;

    auto operator <=> (const person& p) const {
        if (const auto result = name <=> p.name; result != 0) {
            return result;
        } else {
            return surname <=> p.surname;
        }
    }
};

但是我的 IDE (CLion 2020.2) 通過 clang-tidy 警告result != 0實際上應該是result != nullptr 我不知道我們可以將std::###_orderingnullptr進行比較。 Cpprefence 還聲稱我們應該將其與文字0進行比較 那里沒有關於nullptr的內容。

這段代碼:

int main() {
    person p1{"ccc", "vvv"};
    person p2{"aaa", "zzz"};

    std::cout << (p1 < p2);
}

編譯(GCC 10.1.0,Rev3,由 MSYS2 項目構建)並產生與0nullptr版本相同的結果。


但是,我的 IDE 也警告我,我應該“ Clang-Tidy:使用 nullptr ”與p1 < p2 通過應用“修復”,代碼更改為std::cout << (p1 nullptr p2); 哪個,嗯,不編譯。 它暗示它可能是 clang-tidy 中的一個錯誤,但它沒有解釋為什么我們可以將排序與nullptr進行比較。 為什么我們可以,為什么它有效,為什么我們想要它?

但是我的 IDE (CLion 2020.2) 通過 clang-tidy 警告result != 0實際上應該是result != nullptr

這是錯誤的。 它應該是result != 0 比較類別被指定為僅可與文字0進行比較。

檢查可能來自這樣一個事實,即在 C++20 中實現與文字0進行比較的唯一真正方法是采用類型為某個未指定指針或 function 指向成員指針的參數的參數 - 並且 clang-tidy 可能會標記任何0作為指針的參數提供的應該nullptr的東西。 大多數時候,這是正確的。 只是這里不具體。 事實上,如果你寫result != nullptr它可能會編譯 - 但這是錯誤的,你不應該這樣做。

這是一個整潔的問題,它需要了解對於比較類別,它不應該以這種方式標記文字 0 的使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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