【发布时间】:2020-12-05 05:39:34
【问题描述】:
鉴于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 进行比较。还请参考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 进行比较。为什么我们可以,为什么它有效,我们为什么想要它?
【问题讨论】:
-
在您发布的代码中没有提到
nullptr.. -
您的 IDE 不是 C++ 编译器。只有真正的编译器才能完全理解 C++ 代码。尤其是较新版本的 C++。 IDE 错误解析 C++ 代码并不奇怪。
-
@JesperJuhl "并产生与
0和nullptr版本相同的结果。" - 我的意思是如果我们实际上将if (const auto result = name <=> p.name; result != 0)替换为@987654341 @,代码编译并产生预期的结果。 -
@SamVarshavchik:“clang-tidy 也不是 C++ 编译器。它从 C++ 编译器中借用了一些代码,但它本身并不是一个完整的 C++ 编译器。“我不知道这与这个问题有什么关系。 Clang-tidy 并不是说代码不会编译或无效甚至损坏;它提供了关于它认为是编写该代码的更好方法的建议。这就是它的工作;在这种情况下肯定是错误的,但这就是它想要做的。
-
至于“老”
operator <、auto operator <=> (const person& p) const { return std::tie(name, surname) <=> std::tie(p.name, p.surname); ):)(甚至这里是= default;;))
标签: c++ c++20 nullptr spaceship-operator