Безопасно ли переносить NULL/zero на dynamic_cast?

По привычке для проверки нулевых указателей я иногда писал:

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

Фактически, проверяя нулевой указатель перед переходом к динамическому переносу, а также проверяя возврат.

Затем я читаю в документации MSDN

Значение нулевого указателя преобразуется в значение нулевого указателя тип назначения dynamic_cast.

Появляется, что я мог бы безопасно удалить конструкцию?:. Является ли этот перенос С++?

Таким образом, новый код будет

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

Конечно, предполагая, что someBasePtr является либо нулевым, либо действительным, т.е. не диким, указывающим на мусор...

Ответ 1

§5.2.7/4:

Если значение v является нулевым указателем значение в случае указателя, результат - значение нулевого указателя типа R.

Таким образом, вам не нужно проверять нулевой указатель самостоятельно. То же самое касается удаления оператора, удаление нулевого указателя не имеет эффекта.

Ответ 2

Да, вы можете использовать dynamic_cast для нулевого указателя.

Ответ 3

Да, проверьте стандарт 5.2.7.4.

Ответ 4

Мне было любопытно об этом и попробовал это, прежде чем искать этот ответ. Следующий код не вызывает ошибок в С++ 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";
}

Протестируйте его здесь: http://ideone.com/0dSf5p