Une exception utilise-t-elle la sémantique de déplacement lorsqu’elle est émise en C ++ 11?

http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4

Dans cet article, Herb Sutter explique que le lancement d’une exception nécessite une copie de celle-ci car elle est créée de manière temporaire et utilise donc std::auto_ptr pour contourner le temps système std::auto_ptr à la copie. À la lumière de la sémantique de déplacement mise à disposition en C ++ 11, est-ce encore nécessaire?

Je viens de vérifier, et la norme permet

  • omettre la copie ou le déplacement d’un object spécifié par l’opérande d’une expression de projection dans l’object exception
  • omettre la copie ou le déplacement de l’object exception dans la variable de clause catch du même type que l’object exception si vous ne modifiez pas autrement le sens du programme (c’est-à-dire que si vous revenez à la normale et que les captures ultérieures voient soudainement un object exception modifié modifié par le bloc catch précédent).

Étant donné que ces omissions sont autorisées, la spécification exige de considérer en premier lieu la source de la copie ou de la déplacer comme une valeur. Cela signifie donc que les objects respectifs seront déplacés, si possible. Bien sûr, la copie et le déplacement sont toujours autorisés en premier choix.


Mettre à jour

J’ai été informé que la prise en compte de l’initialiseur d’object exception d’un paramètre de clause catch en tant qu’initialiseur rvalue serait probablement supprimée de la norme (car en général, il n’est pas possible de détecter dans tous les cas lorsque le comportement du programme est inchangé une copie / déplacer), je recommande donc de ne pas compter sur cela (deuxième puce ci-dessus).

Vous pouvez toujours compter sur le déplacement d’une variable locale dans l’object exception, comme dans throw x; (première puce ci-dessus).

Déplacer des objects d’exception n’est pas obligatoire maintenant.

C’est un défaut de C ++ 11. Voir CWG1493 .