将成员函数指针与0进行比较总是有效的吗?
在下面的代码中,使用Visual Studio编译器不会引发断言,但是在使用XCode为iPhone编译时会引发该断言:
class X { public: virtual void A() {} }; X x; void main() { // Define a valid member function pointer to X::A. void (X::*p)() = &X::A; assert(p != 0); } 这是编译器中的错误吗?在这种情况下,如何检查空指针呢? 解决方法
代码是正确的,编译器不符合标准,它表示(section [expr.eq],使用C 0x草案n3225中的措辞,但在其他版本中它应该是相同的):
和
空指针常量的相关定义(section [conv.ptr],std :: nullptr_t部分在C 0x中是新的):
和(section [expr.const]):
注意:另外,指向虚拟成员函数的指针的实现定义表示通常是虚拟表的索引,在问题中为0.但是根据标准,断言内部的表达式不检查表示是否为零,它是否检查零文字 – 它是一个空指针检查. Apple编译器显然混淆了两者.如果你想测试表示是否为零,你可以编写assert((intptr_t)p!= 0) – 这将是完全不可移植的. 但是编写的代码对任何符合标准的编译器都是完全可移植的,并且永远不会断言. 编辑:还有一个来自标准的引用,它重复了我们已经学过的内容(第[conv.mem]节):
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |