Con este código:
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;
}
Tenemos:
/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1
Cómo hace el catch
bloque de leer -1
como int&
? No pudimos asignar un valor a una referencia de valor no constante.
¿Y por qué se std::cout
ejecuta la segunda declaración antes de la primera std::cerr
?
We caught an int exception with value: -1
línea debe imprimirse primero.error stream
nostandard stream
.throw
crea una copia (o mueve) el objeto que le pasa. La referencia se une a esa copia. Tiene sentido que la copia sea un valor.Respuestas:
Esto está bien debido a [excepto tirar] / 3
énfasis mío
Como puede ver, aunque es temporal, el compilador lo trata como un valor para inicializar el controlador. Debido a esto, no necesita una referencia constante.
fuente
De esta
throw
referencia :Entonces, aunque el "objeto" es temporal, sigue siendo un valor l y, como tal, puede atraparlo por referencia.
fuente