web-dev-qa-db-fra.com

Comment fonctionnent les lancers et les saisies?

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?

14
Ghasem Ramezani

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.

10
NathanOliver

De cette référence throw :

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.

8