在明确定义的C ++代码中,避免"指针的强制转换策略不能为空#34;

时间:2016-09-25 19:54:45

标签: c++

最近的编译器,例如clang,抱怨如果一个函数测试是否"这个"是NULL,因为根据标准这是非法的。

我有一个大量使用它的程序,我正在尝试清理它。以下是一些不警告的例子 - 这些是否安全?有没有一种很好的方法来获得符合C ++标准的 - > toAA和 - > toAB功能行为? (理想情况下,不会更改调用这些函数的代码,并且速度相当快 - 请参阅下面的注释,在GCC 4.6中测试速度更快。)

#include <stddef.h>

class ClassAA;
class ClassAB;

class ClassBase {
public:
  enum Type {AA, AB};
  Type m_type;
  ClassAA* toAA();
  ClassAB* toAB();
  ClassBase(Type t) : m_type(t) {}
  virtual ~ClassBase() {}
};
class ClassAA : public ClassBase { public: int a; ClassAA():ClassBase(AA) {} };
class ClassAB : public ClassBase { public: int b; ClassAB():ClassBase(AB) {} };

// toAA and toAB are intended to have same function,
// but toAB is significantly better performing on GCC 4.6.
inline ClassAA* ClassBase::toAA() { return dynamic_cast<ClassAA*>(this); }
inline ClassAB* ClassBase::toAB() { return (this && m_type == AB) ? static_cast<ClassAB*>(this) : NULL; }

int foo(ClassBase* bp) {
    if (bp && bp->toAA())   // Legal
    return -1;
    if (dynamic_cast<ClassAA*>(bp))   // Legal
    return -1;
    if (!bp->toAA())             // No warning, is this legal?
    return -1;
    if (bp->toAA()->a)     // No warning, is this legal?
    return 10;
    if (bp->toAB()->b)     // Warning due to use of "this", illagal presumably
    return 20;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

让它们成为自由函数,或者static成员参与。

必须在现有对象上调用非静态成员函数;周期。

您的编译器可能没有警告,因为您没有取消引用this,因此不会触发其检测算法。但这并没有使行为不那么明确。对于所有你知道的事情,编译器可能会省略警告然后偷偷摸摸制作煎饼。