Безопасно ли переносить 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