指向虚拟成员函数的指针是否可比?

时间:2015-04-05 09:11:33

标签: c++ member-function-pointers

我看了an article

  

成员函数指针可以设置为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;
}

根据标准,断言是真的还是未指定的?

1 个答案:

答案 0 :(得分:1)

我认为指向成员的一般指针是对象地址的转换。在指向虚方法的情况下,我认为细节取决于实现。在一般情况下,我认为这样做是个坏主意,但是如果指针在asignation期间被解析为正确的覆盖,它必须作为成员函数的标准指针,并且比较是移位比较和方法签名比较。检查reinterpret_cast以查看会发生什么。