3

このコードを考えると、Aはサードパーティのライブラリにあり、B私が書いたコードは次のとおりです。

class A {...};
class B { public: B( const A &a ); ... };

try
{
    A a(...);
    throw a;
}
catch ( const B &b )
{
    // ...do stuff with B, like log the details to a file...
}

オブジェクトAがスローされた場合、 mycatch Bはスキップされます。オブジェクトBを受け取るコンストラクターがあるので、これが機能することを期待していました。A

これを機能させるためにできることはありますか、または両方のキャッチを処理するためにすべてのcatch句を変更する必要がAありBますか?

4

1 に答える 1

9

いいえ、それはできません。スローされたオブジェクトをハンドラーに一致させる場合、ユーザー定義の変換は考慮されません。C++11 標準のパラグラフ 15.3/3 によると:

Eハンドラーは、次の場合にタイプの例外オブジェクトに一致します

  • ハンドラーの型がcv Torcv T&であり、EandTが同じ型である (最上位の cv 修飾子を無視する)、または

  • ハンドラーはcv Tor型cv T&であり、 orTの明確なパブリック基本クラスです。E

  • ハンドラーの型がcv Torであり、 const T&whereTがポインター型であり、次のいずれかまたは両方でE変換できるポインター型であるT

    • プライベートまたはプロテクトまたはあいまいなクラスへのポインターへの変換を含まない標準のポインター変換 (4.10)

    • 資格変換

  • ハンドラーの型はcv Torconst T&Tあり、 はポインターまたはメンバー型へのポインターであり、Eis std::nullptr_tです。

于 2013-05-01T20:19:13.633 に答える