En répondant à une 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 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 pas supérieur au moindre du nombre d'éléments Avant les éléments effacés et du nombre d'éléments après le éléments effacés.
Génère: 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 d'affectation de déplacement de
T.
Et voici ce qu'il dit à propos de std::vector::erase( [vector.modifiers]/3-5):
Effets: ...
Complexité: Le destructeur de
Test appelé le nombre de fois égal au nombre d'éléments effacés, mais l' opérateur d'affectation de déplacement deTest appelé le nombre de fois égal au nombre d'éléments dans le vecteur après les éléments effacés.Génère: 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 d'affectation de déplacement de
T.
Comme vous pouvez le voir, les spécifications d'exception pour les deux sont les mêmes, mais std::vectoril est explicitement mentionné que l'opérateur d'assignation de déplacement est appelé.
Il est également nécessaire Td'être MoveAssignablepour erase()travailler avec les deux std::vectoret std::deque(Tableau 100), mais cela 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 pas définir l'opérateur d'affectation de déplacement, et cette classe sera être MoveAssignable.
Juste au cas où, j'ai vérifié avec GCC et Clang, et j'appelle effectivement l' std::vector::erase()opérateur d'affectation de copie s'il n'y a pas d'opérateur d'affectation de déplacement, et std::deque::erase()fait de même ( DEMO ).
La question est donc: ai-je manqué quelque chose ou est-ce un problème (éditorial) dans la norme?
Mise à jour: j'ai soumis un problème LWG # 2477 .