5

鉴于cppreference on<=>中的示例,我们可以将示例代码简化为:

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 还声称我们应该将它与 literal 进行比较0。那里什么都nullptr没有。

这段代码:

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

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

编译(GCC 10.1.0,Rev3,由 MSYS2 项目构建)并产生与版本相同的0结果nullptr


但是,我的 IDE 也警告我应该“ Clang-Tidy: Use nullptr ” with p1 < p2. 通过应用“修复”,代码会更改为std::cout << (p1 nullptr p2);无法编译的代码。它暗示它可能是 clang-tidy 中的一个错误,但它没有解释为什么我们可以将排序与nullptr. 为什么我们可以,为什么它有效,为什么我们想要它?

4

1 回答 1

10

但是我的 IDE(CLion 2020.2)通过 clang-tidy 警告说result != 0实际上应该是result != nullptr.

这是错误的。应该是result != 0。比较类别被指定为仅可与文字 0进行比较。

检查可能来自这样一个事实,即0在 C++20 中实现与文字进行比较的唯一真正方法是采用一个参数,其类型是一些未指定的指针或指向成员指针的函数指针 - 并且 clang-tidy 可能会标记0任何您提供作为指针的参数作为应该是的东西nullptr。大多数时候,这是正确的。只是这里不具体。事实上,如果你写result != nullptr它可能会编译 - 但这是错误的,你不应该这样做。

这是一个整洁的问题,它需要了解对于比较类别,它不应该以这种方式标记文字 0 的使用。

于 2020-08-15T15:48:10.257 回答