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-6
wyróż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
T
nazywa się liczbę razy, w liczbie równej liczbie elementów usunięte, ale ruch operatorowi przypisanie zT
nazywa 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::vector
wyraźnie wspomniano, że wywoływany jest operator przypisania przeniesienia.
Istnieje również zapotrzebowanie na T
się MoveAssignable
do erase()
pracy z obu std::vector
i 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 .
źródło
Odpowiedzi:
Na spotkaniu Lenexa problem uzyskała status natychmiastowy wraz z proponowanym rozwiązaniem:
Oznacza to, że jeśli rezolucja zostanie przyjęta, nie będzie specjalnej wzmianki o przydziale ruchu
std::vector::erase
, a także sformułowaniestd::deque::erase
zostanie nieco wyjaśnione.źródło