10

短い件名で質問をうまく表現する方法がわからないので、もっと長い説明を試してみましょう。次の例外クラスがあるとします。

class ExceptionTypeA : public std::runtime_error
{
    // stuff
};

class ExceptionTypeB : public std::runtime_error
{
    // stuff

    operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA
};

次に、これを実行して、キャッチブロックをトリガーすることはできますか?

try
{
    throw ExceptionTypeB();
}
catch (ExceptionTypeA& a)
{
    // will this be triggered?
}

残念ながらそうはならないと思いますが、ネットやSOで情報が見つからなかったので、聞いてみようと思いました。そして、はい、私は自分のコンパイラでプログラムを実行して何が起こるかを見ることができることを理解していますが、それは標準がこの動作について何を言っているのか、私のコンパイラが実装しているのかを教えてくれません(そして私はそれを信頼していません)。

4

1 に答える 1

15

それはいけません。Standardese at 15.3/3

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

  • ハンドラーはタイプcv Torcv T&であり、EとTは同じタイプです(最上位のcv修飾子を無視します)、または
  • ハンドラーはタイプcv Torcv T&であり、TはEの明確なパブリックベースクラス、または
  • ハンドラーはタイプcv1 T* cv2であり、Eはポインタータイプであり、次のいずれかまたは両方によってハンドラーのタイプに変換できます。
    • プライベートクラス、保護されたクラス、またはあいまいなクラスへのポインタへの変換を含まない標準のポインタ変換(4.10)
    • 資格変換

希望するシナリオは、これらのいずれにも一致しません。cv「定数および/または揮発性の組み合わせ」を意味します

于 2010-02-26T16:56:52.463 に答える