Nel rispondere a un'altra domanda mi sono imbattuto in formulazioni leggermente diverse per std::vector::erase()
e std::deque::erase()
.
Questo è ciò che dice C ++ 14 std::deque::erase
( [deque.modifiers]/4-6
, l'enfasi è mia):
Effetti: ...
Complessità: il numero di chiamate al distruttore è uguale al numero di elementi cancellati, ma il numero di chiamate all'operatore di assegnazione non è superiore al minore tra il numero di elementi prima degli elementi cancellati e il numero di elementi dopo il elementi cancellati.
Lancia: niente a meno che non venga generata un'eccezione dal costruttore di copie, dal costruttore di spostamento, dall'operatore di assegnazione o dall'operatore di assegnazione di spostamento di
T
.
Ed ecco cosa dice di std::vector::erase
( [vector.modifiers]/3-5
):
Effetti: ...
Complessità: il distruttore di
T
viene chiamato il numero di volte uguale al numero degli elementi cancellati, ma l' operatore di assegnazione del movimento diT
viene chiamato il numero di volte uguale al numero di elementi nel vettore dopo gli elementi cancellati.Lancia: niente a meno che non venga generata un'eccezione dal costruttore di copie, dal costruttore di spostamento, dall'operatore di assegnazione o dall'operatore di assegnazione di spostamento di
T
.
Come puoi vedere, le specifiche delle eccezioni per entrambe sono le stesse, ma per std::vector
è esplicitamente menzionato che viene chiamato l'operatore di assegnazione dei movimenti.
C'è anche necessità di T
essere MoveAssignable
per erase()
il lavoro sia con std::vector
e std::deque
(Tabella 100), ma questo non implica la presenza dell'operatore di assegnazione mossa: si può definire un operatore di assegnamento per copia, e non definire mossa operatore di assegnazione, e Questa classe essere MoveAssignable
.
Per ogni evenienza, ho verificato con GCC e Clang e in effetti std::vector::erase()
chiama l'operatore di assegnazione delle copie se non è presente alcun operatore di assegnazione di spostamenti e std::deque::erase()
fa lo stesso ( DEMO ).
Quindi la domanda è: mi sono perso qualcosa o questo è un problema (editoriale) nello standard?
Aggiornamento: ho inviato un numero LWG n . 2477 .