问题描述
鉴于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::###_ordering
与nullptr
进行比较。 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也警告我应该对p1 < p2
使用“ Clang-Tidy:Use nullptr ”。通过应用“修复程序”,代码将更改为std::cout << (p1 nullptr p2);
,但是不会编译。它暗示这可能是clang-tidy中的错误,但是并没有解释为什么我们可以将顺序与nullptr
进行比较。我们为什么可以,为什么会起作用,为什么我们要这样做?
解决方法
但是我的IDE(CLion 2020.2)通过clang-tidy发出警告,
result != 0
实际上应该是result != nullptr
。
这是错误的。它应该是result != 0
。比较类别被指定为只能与文字 0
比较。
检查可能来自以下事实:与C ++ 20中的文字0
进行比较的唯一真正方法是采用参数,该参数的类型是某些未指定的指针或指向成员的指针的函数指针-并且clang-tidy可能会将您作为指针参数提供的任何0
标记为应该为nullptr
。大多数时候,这是正确的。只是这里不具体。确实,如果您编写result != nullptr
,它可能会编译-但这是错误的,您不应该这样做。
这是一个整洁的问题,它需要了解,对于比较类别,不应以这种方式标记文字0的使用。