web-dev-qa-db-fra.com

Le constructeur Move par défaut est-il défini comme noexcept?

Il semble qu'un vecteur vérifie si le constructeur de déplacement est étiqueté comme noexcept avant de décider de déplacer ou de copier des éléments lors de la réallocation. Le constructeur de déplacement par défaut est-il défini comme noexcept? J'ai vu la documentation suivante mais elle ne l'a pas spécifié . http://en.cppreference.com/w/cpp/language/move_constructor

Constructeur de déplacement implicitement déclaré

Si aucun constructeur de déplacement défini par l'utilisateur n'est fourni pour un type de classe (struct, classe ou union) et que toutes les conditions suivantes sont remplies: il n'y a pas de constructeur de copie déclaré par l'utilisateur, il n'y a pas d'opérateurs d'affectation de copie déclarés par l'utilisateur, il n'y a pas opérateurs d'affectation de déplacement déclarés par l'utilisateur il n'y a pas de destructeurs déclarés par l'utilisateur le constructeur de déplacement déclaré implicitement n'est pas défini comme supprimé en raison des conditions détaillées dans la section suivante, puis le compilateur déclarera un constructeur de déplacement en tant que membre public en ligne de sa classe avec le signature T :: T (T &&) Une classe peut avoir plusieurs constructeurs de mouvement, par exemple T :: T (const T &&) et T :: T (T &&). Si certains constructeurs de déplacement définis par l'utilisateur sont présents, l'utilisateur peut toujours forcer la génération du constructeur de déplacement déclaré implicitement avec le mot clé default.

67
bjackfly

Je pense que la réponse est 15,4/14 (spécifications d'exception):

Un constructeur héritant (12.9) et une fonction membre spéciale déclarée implicitement (article 12) ont une spécification d'exception . Si f est un constructeur héritant ou un constructeur par défaut implicitement déclaré, constructeur de copie, constructeur de déplacement, destructeur, opérateur d'affectation de copie ou opérateur d'affectation de déplacement, son implicite spécification d'exception spécifie l'ID de type T si et seulement si T est autorisé par l'exception -spécification d'une fonction directement invoquée par la définition implicite de f; f autorise toutes les exceptions si une fonction qu'il invoque directement autorise toutes les exceptions, et f a la spécification d'exception noexcept(true) si chaque fonction qu'elle appelle directement n'autorise aucune exception.

Fondamentalement, il fait ce que vous pensez, et le constructeur de déplacement déclaré implicitement est noexcept chaque fois qu'il peut l'être.

68
Kerrek SB