指向虚拟成员函数的指针是否具有可比性
Are pointers to virtual member functions comparable?
我读到一篇文章说
成员函数指针可以设置为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查看会发生什么。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 检查 2 种类型是否具有可比性
- 指向虚拟成员函数的指针是否具有可比性