С этим кодом:
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&
? Мы не могли присвоить значение неконстантной ссылке на lvalue.
И почему второе std::cout
утверждение выполняется перед первым std::cerr
утверждением?
We caught an int exception with value: -1
Линия должна быть напечатана первой.error stream
нетstandard stream
.throw
создает копию (или перемещает) объект, который вы ему передаете. Ссылка привязывается к этой копии. Это имеет смысл, что копия является lvalue.Ответы:
Это нормально из-за [кроме. Броска] / 3
акцент мой
Как вы можете видеть, хотя это и временно, компилятор обрабатывает его как lvalue для инициализации обработчика. Из-за этого вам не нужна постоянная ссылка.
источник
Из этой
throw
ссылки :Таким образом, хотя «объект» является временным, он все еще является lvalue, и поэтому вы можете перехватить его по ссылке.
источник