web-dev-qa-db-ja.com

NULL /ゼロをdynamic_castに渡しても、移植性は安全ですか?

Nullポインターをチェックする癖から、私は時々書いています:

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

実際には、動的キャストに渡す前にnullポインターをチェックし、戻り値もチェックします。

その後、MSDNドキュメントを読みます

Nullポインター値は、dynamic_castによって宛先の型のnullポインター値に変換されます。

そのとき、私は?:構成を安全に削除できたようです。これはC++ですかportable

新しいコードは

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

もちろんsomeBasePtrがnullまたは有効であること、つまりwildがゴミを指しているとは想定していません...

64
sdg

§5.2.7/ 4:

ポインターの場合、vの値がNULLポインター値である場合、結果はタイプRのNULLポインター値です。

したがって、ヌルポインターを自分で確認する必要はありません。同じことが演算子の削除にも当てはまり、nullポインタを削除しても効果はありません。

76
user405725

はい、dynamic_cast nullポインター。

20
sharptooth

はい、標準で5.2.7.4を確認してください。

5
ssegvic