函数指针的三向比较失败

Three-way comparison of pointer to functions fails

为什么我不能将指向函数的指针与 GCC 主干进行比较?

using f_t = int(*)(int);
f_t a { nullptr }, b { nullptr };
auto c = a <=> b;

int main (){}

给予

a.cpp:4:13: error: invalid operands of types ‘f_t’ {aka ‘int (*)(int)’} and ‘f_t’ {aka ‘int (*)(int)’} to binary ‘operator<=>’
    4 | auto c = (a <=> b) == 0;
      |           ~ ^~~ ~
      |           |     |
      |           |     f_t {aka int (*)(int)}
      |           f_t {aka int (*)(int)}

在函数指针上使用普通关系运算符的结果是 unspecified if the pointers are unequal。您可以比较指向对象的指针(但只有当它们是指向同一数组或结构的指针时才有意义),但是关联函数指针并不真正可行。

而不是采取有时未指定的路线,C++20 simply forbids using <=> for non-object pointers

您可以测试这些指针之间的相等性,但不能测试它们的相对顺序。如果您出于某种原因绝对需要这样做,您可以将指针转换为 void*s 并使用 std::less<> 进行此类比较。