キャストにポインタが含まれる場合はNULL
と評価されますが、キャストに参照型が含まれている場合はbad_cast
例外がスローされます。キャストが失敗したときのC++のdynamic_cast動作
なぜこの動作の違いがありますか?
おかげ
キャストにポインタが含まれる場合はNULL
と評価されますが、キャストに参照型が含まれている場合はbad_cast
例外がスローされます。キャストが失敗したときのC++のdynamic_cast動作
なぜこの動作の違いがありますか?
おかげ
がNULL参照:)
は、実際に(というか、nullに参照)null参照があるかもしれないようなものはありませんが、それは未定義の動作(UB)ですので。標準はが UBを定義していないので、dynamic_cast
は例外をスローします。これはかなり明確です。
私は次のとおりではありません:)説明してください:) – ScarletAmaranth
NULLへの参照にはint型の型がありますが、これはあなたが意味するものではないと思います。ただし、参照が有効なオブジェクトを持たない参照を初期化することはできません。 –
@JamesKanze:それは私の言いたいことです。 – Nawaz
実際にはヌル参照がある可能性があります。 – Nawaz
このコードはコンパイルされますが、動作が未定義になります: 'int&i = *((int *)0);'。 'dyanmic_cast'が(まれなケースでは)未定義の動作を引き起こすのは間違っています。無効な型がキャストの終点として選ばれたので、代わりに例外がスローされます。これはよく定義された動作です。 :-) – Omnifarious
ええ、私はここで高レベルの理由をもっと探していましたが、James Kanzeはそれをかなり要約しました。オブジェクトを参照せずに参照を初期化することはできません。 – ScarletAmaranth