web-dev-qa-db-ja.com

intのスローとキャッチはどのように機能しますか?

このコードで:

int main()
{
    try
    {
        throw -1;
    }
    catch (int& x)
    {
        std::cerr << "We caught an int exception with value: " << x << std::endl;
    }
    std::cout << "Continuing on our merry way." << std::endl;

    return 0;
}

我々は持っています:

/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1

catchブロックは-1int&としてどのように読み取りますか?非const左辺値参照に値を割り当てることができませんでした。

また、2番目のstd::coutステートメントが最初のstd::cerrステートメントの前に実行されるのはなぜですか。

14
Ghasem Ramezani

[except.throw]/ のため、これは問題ありません。

例外をスローすると、例外オブジェクトと呼ばれる一時オブジェクトがコピー初期化([dcl.init]、[class.copy.ctor])されます。 テンポラリを示す左辺値は、一致するハンドラで宣言された変数を初期化するために使用されます([except.handle])。

重点鉱山

ご覧のとおり、これは一時的なものですが、コンパイラーはハンドラーを初期化するための左辺値として扱います。このため、const参照は必要ありません。

10
NathanOliver

From this throw reference

他の一時オブジェクトとは異なり、catch句のパラメーターを初期化するとき、例外オブジェクトは左辺値引数と見なされるため、左辺値参照によってキャッチされ、変更され、再スローされます。

したがって、「オブジェクト」は一時的なものですが、それでも左辺値であるため、参照によってそれをキャッチできます。