web-dev-qa-db-fra.com

Portablement sûr de passer NULL / zéro à dynamic_cast?

Par habitude de vérifier les pointeurs nuls, j'ai parfois écrit:

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

En effet, vérifier un pointeur nul avant de passer à une distribution dynamique, et également vérifier le retour.

J'ai ensuite lu dans la documentation MSDN

Une valeur de pointeur null est convertie en valeur de pointeur null du type de destination par dynamic_cast.

Il semble alors que je pourrais retirer la construction?: En toute sécurité. Est-ce C++ portable?

Telle que le nouveau code serait

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

Bien sûr, en supposant que someBasePtr est soit nul soit valide, c'est-à-dire pas wild pointant vers des ordures ...

64
sdg

§5.2.7/4:

Si la valeur de v est une valeur de pointeur nulle dans le cas du pointeur, le résultat est la valeur de pointeur nulle de type R.

Vous n'avez donc pas à vérifier vous-même un pointeur nul. Il en va de même pour l'opérateur delete, la suppression d'un pointeur nul n'a aucun effet.

76
user405725

Oui, vous pouvez utiliser dynamic_cast sur un pointeur nul.

20
sharptooth

Oui, vérifiez 5.2.7.4 en standard.

5
ssegvic