次のいずれかにあてはまる場合に、T 型のハンドラはE 型の throw と一致します。
T が E と同じ型である
T が、E の const か volatile である
E が、T の const か volatile である
T が E の参照か、E が T の参照である
T が E の公開基底クラスである
T と E の両方ともポインタ型で、かつ E は標準のポインタ変換を使用して T に変換 できる
参照やポインタ型の例外を送出すると、「ポインタのからまり」という問題が発生する可能性があります。これは、例外処理が完了する前にポインタの宛先または参照先のオブジェクトが破壊された場合に起こります。オブジェクトが送出される場合、コピーコンストラクタによりオブジェクトのコピーが必ず作成され、このコピーが catch ブロックに渡されます。そのため、局所的なオブジェクトまたは一時的なオブジェクトを送出しても安全です。
(X) 型と (X&) 型の両方のハンドラとも X 型の例外と一致しますが、意味は異なります。(X) 型のハンドラを使用すると、そのオブジェクトのコピーコンストラクタを (再び) 起動することになり、そのオブジェクトを切り捨てる可能性があります。ハンドラの型から派生した型のオブジェクトが送出される場合、オブジェクトは切り捨てられます。そのため、通常は参照によりクラスオブジェクトを捕獲する方が実行速度が速くなります。
try ブロックのハンドラは現われる順序で使用されます。派生クラスのハンドラを確実に起動するには、派生クラスのハンドラ (または派生クラスの参照へのポインタ) を基底クラスのハンドラより前に置いてください。