Mit diesem Code:
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;
}
Wir haben:
/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1
Wie funktioniert der catch
Block gelesen , -1
wie int&
? Wir konnten einer nicht konstanten Wertreferenz keinen Wert zuweisen.
Und warum wird die zweite std::cout
Anweisung vor der ersten std::cerr
Anweisung ausgeführt?
We caught an int exception with value: -1
Zeile sollte zuerst gedruckt werden.error stream
nicht umgeleitetstandard stream
.throw
erstellt eine Kopie (oder verschiebt) das Objekt, das Sie an das Objekt übergeben. Die Referenz ist an diese Kopie gebunden. Es macht irgendwie Sinn, dass die Kopie ein Wert ist.Antworten:
Dies ist in Ordnung wegen [außer werfen] / 3
Betonung meiner
Wie Sie sehen, wird es vom Compiler als temporärer Wert für die Initialisierung des Handlers behandelt, obwohl es sich um einen temporären Wert handelt. Aus diesem Grund benötigen Sie keine konstante Referenz.
quelle
Aus dieser
throw
Referenz :Während das "Objekt" temporär ist, ist es immer noch ein Wert und als solcher können Sie es als Referenz abfangen.
quelle