指向虚拟成员函数的指针是否具有可比性

Are pointers to virtual member functions comparable?

本文关键字:是否 可比性 指针 虚拟成员 函数      更新时间:2023-10-16

我读到一篇文章说

成员函数指针可以设置为0,并提供运算符==和!=,但仅用于同一类的成员函数指针。

我正在努力理解C++11,第5.10节。

§5.10/1中,它说

可以比较相同类型的指针(指针转换后)平等。

§5.10/2中,它说

否则,如果其中一个是指向虚拟成员函数的指针,则结果未指定。

现在考虑以下测试程序。

#include <cassert>
class ISomeClass
{
public:
   virtual ~ISomeClass() {}
   virtual void a() = 0;
   virtual void b() = 0;
};
int main()
{
   typedef void(ISomeClass::*MemberPtr)();
   MemberPtr mp = &ISomeClass::a;
   assert( mp == &ISomeClass::a );
   assert( mp != &ISomeClass::b );
   return 0;
}

根据标准,这些断言是真实的还是未指明的?

我认为指向成员的通用指针是对对象地址的转换。在指向虚拟方法的指针的情况下,我认为细节取决于实现。在一般情况下,我认为这样做是个坏主意,但如果指针在签名过程中被解决为正确的重写,它必须作为指向成员函数的标准指针,并且比较是移位比较加方法签名比较。选中interpret_cast to long查看会发生什么。