Odpowiadając na inne pytanie, natknąłem się na nieco inne sformułowania dla std::vector::erase()i std::deque::erase().
Oto, o czym mówi C ++ 14 std::deque::erase( [deque.modifiers]/4-6wyróżnienie moje):
Efekty: ...
Złożoność: liczba wywołań do destruktora jest taka sama, jak liczba usuniętych elementów, ale liczba wywołań operatora przypisania jest nie większa niż mniejsza z liczby elementów Przed skasowanymi elementami i liczba elementów po wymazane elementy.
Zgłasza: nic, chyba że konstruktor kopiujący, konstruktor przenoszenia, operator przypisania lub operator przypisania przenoszenia nie zgłosi wyjątku
T.
A oto, o czym mówi std::vector::erase( [vector.modifiers]/3-5):
Efekty: ...
Złożoność: destruktora
Tnazywa się liczbę razy, w liczbie równej liczbie elementów usunięte, ale ruch operatorowi przypisanie zTnazywa się liczbę razy, w liczbie równej liczbie elementów w wektorze po skasowanych elementów.Zgłasza: nic, chyba że konstruktor kopiujący, konstruktor przenoszenia, operator przypisania lub operator przypisania przenoszenia nie zgłosi wyjątku
T.
Jak widać, specyfikacje wyjątków dla obu z nich są takie same, ale std::vectorwyraźnie wspomniano, że wywoływany jest operator przypisania przeniesienia.
Istnieje również zapotrzebowanie na Tsię MoveAssignabledo erase()pracy z obu std::vectori std::deque(tabela 100), ale nie oznacza to obecność operatora przypisania ruch: można zdefiniować operatorowi przypisanie kopiowania i nie określają ruch operatora zadanie, a to klasa być MoveAssignable.
Na wszelki wypadek sprawdziłem za pomocą GCC i Clang i rzeczywiście std::vector::erase()wywołuje operatora przypisania kopiowania, jeśli nie ma operatora przypisania przeniesienia, i std::deque::erase()robi to samo ( DEMO ).
Pytanie brzmi więc: czy coś przeoczyłem, czy to jest (redakcyjna) kwestia w standardzie?
Aktualizacja: przesłałem nr 2477 LWG .