7

noexceptとマークされた関数があるが、内部にスローできるコード行があるとしましょう。そのコード行は try ブロックになり、例外がキャッチされます。それは何かを引き起こしますか?

void MyFunc() noexcept
{
    try {
        throw std::exception("...");
    } catch (const std::exception & e) {
        // I'll deal with it here...
    }
}
4

2 に答える 2

10

例外ハンドラーの検索は、例外を処理するものが見つからない場合は常に 1 レベル下まで検索して、内側から外側へと実行されます。

15.3 例外処理 [except.handle]

4 try ブロックのハンドラは、出現順に試行されます。[...]

[...]

6 try ブロックのハンドラー間で一致が見つからない場合、一致するハンドラーの検索は、同じスレッドの動的に囲まれた try ブロックで続行されます。

15.4 例外指定 [except.spec]

9 例外がスローされ、ハンドラー (15.3) の検索で、例外を許可しない例外仕様を持つ関数の最も外側のブロックに遭遇するたびに、

【・・・と呼ばれstd::unexpected()たり。std::terminate()]

noexcept(true)目に見える効果があるのは、関数内から例外がスローされ、一致するハンドラーが存在しない場合のみです。一致するハンドラーを持つ例外には特別な効果は指定されていないため、noexcept(false)関数内と同じように実行する必要があります。

于 2015-03-10T22:28:26.497 に答える
5

はい、例外が関数から漏れない限り、これは完全に合法です。

実装は、式が実行されたときに含まれる関数が許可しない例外をスローするか、スローする可能性があるという理由だけで、式を拒否してはなりません。

[C++11 の .spec/11 を除く]

于 2015-03-10T22:11:43.077 に答える