指向函数的指针的三路比较失败

3

为什么我无法使用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)}


2
<=>不相等时,您期望返回什么?函数地址甚至比普通地址更没有用(在编译之间变化,如果一个函数来自使用ASLR加载的单独DLL /共享对象,则甚至可以在运行时变化);确定哪个更小或更大并没有什么有用的信息。早期的C ++规范仅为函数指针定义了 == / !=;我不会期望他们已经扩展了它。 - ShadowRanger
1
这个回答解决了你的问题吗?如何比较指针? - 273K
1个回答

4
使用普通关系运算符比较函数指针的结果是不确定的,如果指针不相等(但指向同一数组或结构体中的指针除外),请参阅此处。然而,比较函数指针并不是可行的选择。
与其采用有时不确定的方法,C++20 禁止对非对象指针使用 <=>
您可以测试这些指针之间的相等性,但不能比较它们的顺序。如果出于某种原因绝对需要比较它们的顺序,可以将指针转换为 void* 并使用 std::less<> 进行比较。

void*类型的比较是否有定义? - Barry
好的,但是 auto d = a < b; 确实可以编译。 - le migou
2
@Barry:这是针对指针应用的std::less。也就是说,如果将函数指针转换为void*是一个定义良好的操作(实际上并不是必需的),那么std::less必须提供这些指针的定义良好的全序。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接