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;
}
Nous avons:
/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1
Comment le bloc catch
lit-il -1
comme int&
? Nous n'avons pas pu affecter une valeur à une référence de valeur non constante.
Et pourquoi le deuxième std::cout
instruction exécutée avant le premier std::cerr
déclaration?
C'est correct à cause de [except.throw]/
Le lancement d'une exception initialise la copie ([dcl.init], [class.copy.ctor]) d'un objet temporaire, appelé objet d'exception. Une valeur l désignant le temporaire est utilisée pour initialiser la variable déclarée dans le gestionnaire de correspondance ([except.handle]).
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.
Contrairement à d'autres objets temporaires, l'objet exception est considéré comme un argument lvalue lors de l'initialisation des paramètres de la clause catch, il peut donc être capturé par la référence lvalue, modifié et renvoyé.
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.