在C ++ 11中,失败的dynamic_cast是返回NULL还是std :: nullptr?

时间:2016-06-20 02:39:47

标签: c++ c++11

假设我有类层次结构:

class Base{
}

class Derived : public Base{

}

假设我想检查某个对象是否为Derived类型:

Base* b = new Base();
Derived* d = dynamic_cast<Derived*>(b);
if(b!=nullptr){ //Should this check be for 0, NULL or nullptr ?
// b is not  Derived
}

我应该在C ++ 11中测试0,NULL还是nullptr?

找到答案:(抱歉,我通过谷歌搜索时没有显示) In c++11, does dynamic_cast return nullptr or 0?

1 个答案:

答案 0 :(得分:3)

C ++11§5.2.7/ 9
  

失败的[动态]强制转换为指针类型的值是所需结果类型的空指针值。

无论如何,使用nullptr以便与读者清楚地沟通代码是个好主意。

请注意,引用类型失败的dynamic_cast会引发异常,因为不存在空引用。

为了检查静态已知的多态类型o的对象Base是否真的是Derived,您可以直接在dynamic_cast中使用if条件 - 没有必要明确地将它与任何东西进行比较:

if( auto pd = dynamic_cast<Derived*>( &o ) )
{
    // Use pd here
}