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