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

问题描述

鉴于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项目构建),并产生与0nullptr版本相同的结果。


但是,我的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的使用。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...