2011-03-01 12 views
42

Por costumbre para el control de punteros nulos, me han escrito a veces:Portably seguro para pasar NULL/zero a dynamic_cast?

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

En efecto, la comprobación de un puntero nulo antes de pasar al elenco dinámico, y también comprobar el retorno.

luego leí en la documentación de MSDN

Un valor de puntero nulo se convierte en el valor de puntero nulo del tipo destino mediante moldeado dinámico.

Parece que podría eliminar el?: Constructo de forma segura. ¿Es esto C++ portátil?

tal que el nuevo código sería

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

Por supuesto suponiendo que someBasePtr es null o válida, es decir, no salvaje que apunta a la basura ...

Respuesta

58

§5.2.7/4:

Si el valor de v es un valor de puntero nulo en el caso del indicador, el resultado es el valor de puntero nulo de tipo R.

Para que no tenga que buscar un puntero nulo usted mismo. Lo mismo ocurre con la eliminación del operador, eliminar un puntero nulo no tiene ningún efecto.

20

Sí, se puede use dynamic_cast en un puntero nulo.

+5

1. Como se especifica en 5.2.7/4 – Erik

4

Sí, verifique 5.2.7.4 en la norma.

0

Tenía curiosidad por eso y lo intenté antes de buscar en Google esta respuesta. El siguiente código no produce errores en 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"; 
} 

prueba aquí: http://ideone.com/0dSf5p

+0

¿Por qué el voto a favor? Agregué un ejemplo de trabajo para que todos puedan probarlo ... ¿Qué puede estar mal con eso? –

+4

No fui el que menos votó pero: La pregunta es si es válido hacerlo en la especificación y si es portátil. Como señaló la respuesta aceptada, es válida de acuerdo con el estándar, pero si no fuera así, digamos que no estaba definida, su ejemplo podría haber funcionado en un compilador particular, pero no respondería si es portátil o no. . – user3533716

Cuestiones relacionadas