功能指针的比较合法吗

时间:2018-06-29 12:12:10

标签: c++ function-pointers

我想知道如果两个函数具有相同的类型或强制转换为==,则比较(不仅是!=void*)函数指针是否合法。

下面是一些示例代码:

    #include <iostream>
    struct A { static void f(){} };
    struct B { static void f(){} };
    int main()
    {
        std::cout << reinterpret_cast<void*>(&A::f) << '\n';
        std::cout << reinterpret_cast<void*>(&B::f) << '\n';
        std::cout << (&A::f < &B::f) << '\n';
    }

GCC(http://coliru.stacked-crooked.com/a/c03b2d2dc528c197)和Clang(http://coliru.stacked-crooked.com/a/3330f8e0b88cc523)似乎还不错。

有人可以指出我标准中正确的段落吗?

谢谢!

1 个答案:

答案 0 :(得分:6)

您的示例可能无法编译。如果可以编译,则不能保证它能按预期工作。但是实际上,它可能会。

从C ++ 11开始,实现定义的结果有条件地支持将函数指针转换为对象指针。有条件支持意味着实现可以选择是否要支持它。如果没有,他们可能只是发出错误消息。

对于确实支持它的实现,几乎不能保证转换的结果:这就是说,如果支持,则可以将其转换回原始值。这并不意味着有关相等或关系比较的结果。

[expr.reinterpret.cast]p8

  

8有条件地支持将函数指针转换为对象指针类型,反之亦然。这种转换的含义是实现定义的,除非如果实现支持双向转换,则将一种类型的prvalue转换为另一种类型的prvalue,然后再转换回去(可能具有不同的cv限定条件)将产生原始指针值。 / p>

要进行有意义的==!=比较,只需直接进行比较。

[expr.eq]p3

  

[...]

     

(3.2)否则,如果指针都为null,都指向相同的函数或都表示相同的地址,则它们比较相等。
  (3.3)否则,指针比较不相等。

对于<<的通常规则使您的比较与int i, j; &i < &j;一样毫无意义:

[expr.rel]p4

  

4比较对象的不相等指针 86 的结果是根据符合以下规则的部分顺序定义的:

     

[...]

     

(4.3)否则,两个指针都不需要比另一个指针大。