Avec ce 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;
}
On a:
/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1
Comment le catch
bloc lu -1
comme int&
? Nous n'avons pas pu attribuer de valeur à une référence de valeur non constante.
Et pourquoi la deuxième std::cout
déclaration est-elle exécutée avant la première std::cerr
déclaration?
We caught an int exception with value: -1
ligne doit être imprimée en premier.error stream
nonstandard stream
.throw
crée une copie (ou déplace) l'objet que vous lui passez. La référence se lie à cette copie. Il est en quelque sorte logique que la copie soit une valeur l.Réponses:
C'est correct à cause de [except.throw] / 3
mettre l'accent
Comme vous pouvez le voir, même s'il s'agit d'un fichier temporaire, le compilateur le traite comme une valeur l pour initialiser le gestionnaire. Pour cette raison, vous n'avez pas besoin d'une référence const.
la source
De cette
throw
référence :Ainsi, même si "l'objet" est temporaire, il s'agit toujours d'une valeur l et, en tant que tel, vous pouvez l'attraper par référence.
la source