Portable safe可以将NULL /零传递给dynamic_cast?

出于检查空指针的习惯,我有时写道:

MyClass * c = someBasePtr ? dynamic_cast<MyClass*>(someBasePtr) : 0; if (c) {... 

实际上,在传递给dynamic转换之前检查一个空指针,并检查返回。

然后我阅读MSDN文档

通过dynamic_cast将空指针值转换为目标types的空指针值。

看来,我可以安全地删除?:构造。 这是C + + 可移植吗?

这样新的代码将是

 MyClass * c = dynamic_cast<MyClass*>(someBasePtr); if (c) {... 

当然假定someBasePtr是空的或有效的,即不野生指向垃圾…

§5.2.7/ 4:

如果v的值是指针情况下的空指针值,则结果是typesR的空指针值。

所以你不必自己检查一个空指针。 操作员删除也一样,删除一个空指针没有任何作用。

是的,你可以在空指针上使用dynamic_cast

是的,在标准中检查5.2.7.4。

我对此很好奇,并在Googlesearch这个答案之前尝试过。 以下代码在C ++ 14中不会产生错误。

 class A { public: virtual ~A() {} }; class B: A {}; #include <iostream> int main() { A* error_pointer = nullptr; B* x = dynamic_cast<B*>(error_pointer); std::cout<<"No errors :)\n"; } 

在这里testing: http : //ideone.com/0dSf5p