Portable safe para pasar NULL/cero a la conversión dinámica?


Por costumbre para comprobar punteros nulos, a veces he escrito:

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

En efecto, la comprobación de un puntero nulo antes de pasar a la conversión dinámica, y también comprobar el retorno.

Luego leo en la documentación de MSDN

Un valor de puntero nulo se convierte en el valor del puntero nulo de la tipo de destino por dynamic_cast.

Parece entonces que podría quitar el?: construir con seguridad. ¿Es esto C++ portable?

Tal que el nuevo código sería

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

Por supuesto, suponiendo que someBasePtr es nulo o válido, es decir, no salvaje apuntando a la basura...

Author: sdg, 2011-03-01

3 answers

§5.2.7/4:

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

Así que no tienes que buscar un puntero nulo tú mismo. Lo mismo ocurre con el operador delete, eliminar un puntero nulo no tiene efecto.

 62
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-30 19:58:35

Sí, puede usar dynamic_cast en un puntero nulo.

 20
Author: sharptooth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-01 14:28:47

Sí, compruebe 5.2.7.4 en estándar.

 5
Author: ssegvic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-01 14:32:48