Z tym kodem:
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;
}
Mamy:
/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1
W jaki sposób catch
blok czytać -1
jak int&
? Nie można przypisać wartości do nieistniejącego odwołania do wartości.
I dlaczego druga std::cout
instrukcja jest wykonywana przed pierwszą std::cerr
instrukcją?
We caught an int exception with value: -1
Linia powinna być pierwszy wydrukowany.error stream
niestandard stream
.throw
tworzy kopię (lub przenosi) przekazywany do niej obiekt. Odwołanie wiąże się z tą kopią. To ma sens, że kopia jest wartością.Odpowiedzi:
Jest to w porządku z powodu [wyjątkiem. Rzut] / 3
mój nacisk
Jak widać, nawet jeśli jest to tymczasowy, kompilator traktuje go jako wartość do zainicjowania modułu obsługi. Z tego powodu nie potrzebujesz stałej referencji.
źródło
Z tego
throw
odniesienia :Tak więc „obiekt” jest tymczasowy, ale nadal jest wartością i jako taki można go złapać przez odniesienie.
źródło