web-dev-qa-db-fra.com

Copier / déplacer l'affectation dans std :: vector :: erase () et std :: deque :: erase ()

En train de répondre ne autre question je suis tombé sur des formulations légèrement différentes pour std::vector::erase() et std::deque::erase().

Voici ce que dit C++ 14 à propos de std::deque::erase ([deque.modifiers]/4-6, C'est moi qui souligne):

Effets: ...

Complexité: Le nombre d'appels au destructeur est le même que le nombre d'éléments effacés, mais Le nombre d'appels à l'opérateur d'affectation n'est que le moindre du nombre d'éléments avant les éléments effacés et du nombre d'éléments après les éléments effacés.

Lance: Rien sauf si une exception est levée par le constructeur de copie, le constructeur de déplacement, l'opérateur d'affectation ou l'opérateur de déplacement assigné de T.

Et voici ce qu'il dit à propos de std::vector::erase ([vector.modifiers]/3-5):

Effets: ...

Complexité: Le destructeur de T est appelé le nombre de fois égal au nombre d'éléments effacés, mais l'opérateur d'affectation de déplacement de T est appelé le nombre de fois égal au nombre d'éléments dans le vecteur après les éléments effacés.

Lance: Rien sauf si une exception est levée par le constructeur de copie, le constructeur de déplacement, l'opérateur d'affectation ou l'opérateur de déplacement assigné de T.

Comme vous pouvez le voir, les spécifications d'exception pour les deux sont les mêmes, mais pour std::vector, Il est explicitement mentionné que l'opérateur d'affectation de déplacement est appelé.

Il est également nécessaire que T soit MoveAssignable pour erase() pour fonctionner avec std::vector Et std::deque (Tableau 100), mais ceci n'implique pas la présence de l'opérateur d'affectation de déplacement: on peut définir un opérateur d'affectation de copie, et non définir l'opérateur d'affectation de déplacement, et cette classe sera MoveAssignable.

Juste au cas où, j'ai vérifié avec GCC et Clang, et en effet std::vector::erase() appelle l'opérateur d'affectation de copie s'il n'y a pas d'opérateur d'affectation de mouvement, et std::deque::erase() fait de même ( DÉMO ).

La question est donc la suivante: ai-je raté quelque chose ou s'agit-il d'un problème (rédactionnel) dans la norme?

Mise à jour: J'ai soumis un numéro LWG # 2477 .

135
Anton Savin

Lors de la réunion de Lenexa, la question a obtenu le statut Immédiat avec la résolution proposée:

Cette formulation est relative à N4296.

Remplacez 23.3.3.4 [deque.modifiers]/5 par:

-5- Complexité: Le nombre d'appels au destructeur de T est le même que le nombre d'éléments effacés, mais le nombre d'appels à l'opérateur d'affectation de T n'est pas supérieur au moindre du nombre de éléments avant les éléments effacés et le nombre d'éléments après les éléments effacés.

Remplacez 23.3.6.5 [vector.modifiers]/4 par:

-4- Complexité: Le destructeur de T est appelé le nombre de fois égal au nombre d'éléments effacés, mais le bouge toi L'opérateur d'affectation de T est appelé le nombre de fois égal au nombre d'éléments dans le vecteur après les éléments effacés.

Autrement dit, si la résolution est acceptée, il n'y aura aucune mention spéciale de l'affectation de déplacement pour std::vector::erase, ainsi que le libellé de std::deque::erase sera un peu clarifié.

9
Anton Savin