函数指针的比较是否合法
Is comparison of function-pointers legal
我想知道如果两个函数具有相同的类型或被强制转换为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(似乎对此很好。
有人可以指出标准中的正确段落吗?
谢谢!
您的示例可能无法编译。如果它确实编译,则不能保证按预期工作。但在实践中,它很可能会。
从 C++11 开始,有条件地支持将函数指针转换为对象指针,并具有实现定义的结果。有条件支持意味着实现可以选择是否要支持它。如果他们不这样做,他们可能只会发出错误消息。
对于确实支持它的实现,很少保证转换的结果:所说的只是,如果它受支持,你可以把它转换回来并获取原始值。这并不意味着平等或关系比较的结果。
[expr.reinterpret.cast]p8:
8 有条件地支持将函数指针转换为对象指针类型,反之亦然。这种转换的含义是实现定义的,除了如果实现支持双向转换,则将一种类型的 prvalue 转换为另一种类型并返回(可能具有不同的 cv 限定(应生成原始指针值。
对于有意义的==
和!=
比较,只需直接比较即可。
[expr.eq]p3:
[...]
(3.2(否则,如果指针都是空的,都指向同一个函数,或者都表示相同的地址,则它们比较相等.
(3.3(否则,指针比较不相等。
至于<
,通常的<
规则会使你的比较和int i, j; &i < &j;
一样毫无意义:
[expr.rel]p4:
4 比较对象86的不相等指针的结果是根据符合以下规则的偏序定义的:
[...]
(4.3( 否则,两个指针都不需要大于另一个指针。
- std::less是否应该允许在编译时比较不相关的指针?
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 用户定义的结构是否有默认C++比较器?
- gcc 是否在 2 条短裤的过度对齐结构的比较中错过了优化机会?
- 这种比较是否不一致(或者存在其他问题)?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- 我如何比较这些不同的输出,看看它们是否相等
- C++中是否有任何常量可以用作比较中的最小值/最大值
- 函数指针的比较是否合法
- 是否有任何统一的方法可以在 c++ 中创建自定义比较器?
- C++是否保证标准容器比较中操作数的顺序?
- C++中的结构是否按顺序分配内存?每次都以某种方式获得指针比较的正确答案
- C 是否具有对两个STD :: sets,vectors等进行三角比较的标准方法
- 比较BGR图像是否完全相同
- qsort C++是否曾经将元素与自身进行比较?
- 是否可以将两个任意函数与 C++17 中的 std::any 进行比较
- 是否可以比较两个函子的相等性
- 将无符号的 int 与 std::string::size_type 进行比较是否安全
- 三向比较运算符是否始终有效