このコードで:
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 lvalue参照に値を割り当てることができませんでした。
そして、なぜstd::cout
最初のstd::cerr
ステートメントの前に2番目のステートメントが実行されるのですか?
@Scheff、申し訳ありませんが、最初の出力は
—
Ghasem Ramezani
error stream
notにリダイレクトされstandard stream
ます。
@FrançoisAndrieux許可されている理由は、さまざまなセマンティクスが実行されているためです。一般的に、テンポラリでは、どうなるかわからないため、テンポラリへのconst参照のみを許可することにしました。例外を除いて、オブジェクトの存続期間はわかっているため、オブジェクトを変更して、より高いコンテキストに再スローすることができます。これを容易にするために、標準では非const左辺値参照へのバインドが許可されています。
—
NathanOliver
@FrançoisAndrieux
—
HolyBlackCat
throw
は、渡されたオブジェクトのコピーを作成(または移動)します。参照はそのコピーにバインドします。コピーが左辺値であるというのは理にかなっています。
We caught an int exception with value: -1
行が最初に印刷されなければなりません。