gpt4 book ai didi

c++ - 将三路比较运算符的结果与 nullptr 进行比较有什么作用?

转载 作者:行者123 更新时间:2023-12-01 13:19:29 24 4
gpt4 key购买 nike

给出来自 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也 claims that we should rather compare it with 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:使用 nullptr”和 p1 < p2 .通过应用“修复”,代码更改为 std::cout << (p1 nullptr p2);好吧,它不能编译。它暗示它可能是 clang-tidy 中的一个错误,但它并没有解释为什么我们可以将排序与 nullptr 进行比较。 .为什么我们可以,为什么它有效,为什么我们想要它?

最佳答案

But my IDE (CLion 2020.2), via clang-tidy, warns that result != 0 should actually be result != nullptr.


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

关于c++ - 将三路比较运算符的结果与 nullptr 进行比较有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63427915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com