このコードで:
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
ブロックは-1
をint&
としてどのように読み取りますか?非const左辺値参照に値を割り当てることができませんでした。
また、2番目のstd::cout
ステートメントが最初のstd::cerr
ステートメントの前に実行されるのはなぜですか。
[except.throw]/ のため、これは問題ありません。
例外をスローすると、例外オブジェクトと呼ばれる一時オブジェクトがコピー初期化([dcl.init]、[class.copy.ctor])されます。 テンポラリを示す左辺値は、一致するハンドラで宣言された変数を初期化するために使用されます([except.handle])。
重点鉱山
ご覧のとおり、これは一時的なものですが、コンパイラーはハンドラーを初期化するための左辺値として扱います。このため、const参照は必要ありません。
From this throw
reference :
他の一時オブジェクトとは異なり、catch句のパラメーターを初期化するとき、例外オブジェクトは左辺値引数と見なされるため、左辺値参照によってキャッチされ、変更され、再スローされます。
したがって、「オブジェクト」は一時的なものですが、それでも左辺値であるため、参照によってそれをキャッチできます。