Nel processo di risposta a another question mi sono imbattuto in diciture leggermente diverse per std::vector::erase()
e std::deque::erase()
.Copia/sposta l'assegnazione in std :: vector :: erase() e std :: deque :: erase()
Questo è ciò che C++ 14 dice di std::deque::erase
([deque.modifiers]/4-6
, sottolineatura mia):
Effetti: ...
Complessità: Il numero di chiamate al distruttore è uguale al numero di elementi cancellati, ma Il numero di chiamate all'operatore di assegnazione è nient'altro che il numero minore di elementi Prima gli elementi cancellati e il numero di elementi dopo gli elementi cancellati.
Produce: Niente meno che non viene generata un'eccezione da parte del costruttore di copia, spostare il costruttore, operatore di assegnazione, o spostare operatore di assegnazione di
T
.
E qui è quello che dice circa std::vector::erase
([vector.modifiers]/3-5
):
Effetti: ...
Complessità: Il distruttore di
T
è chiamato il numero di volte pari al numero degli elementi cancellati, ma l'operatore di spostamento diT
viene chiamato il numero di volte e qual rispetto al numero di elementi nel vettore dopo gli elementi cancellati.Produce: Niente meno che non viene generata un'eccezione da parte del costruttore di copia, spostare il costruttore, operatore di assegnazione, o spostare operatore di assegnazione di
T
.
Come si può vedere, le specifiche eccezioni per ciascuno di essi sono gli stessi, ma per std::vector
E 'esplicitamente menzionato che operatore di assegnazione mossa si chiama.
C'è anche requisito per T
per essere MoveAssignable
per erase()
di lavorare sia con std::vector
e std::deque
(Tabella 100), ma ciò non implica la presenza dell'operatore di assegnazione mossa: si può definire un operatore di assegnamento per copia, e non definire l'operatore di assegnazione del movimento e questa classe sarà MoveAssignable
.
Solo nel caso, ho controllato con GCC e Clang, e in effetti std::vector::erase()
chiamate copiare operatore di assegnazione, se non c'è nessun operatore di assegnazione spostare 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 LWG issue #2477.
Sembra un difetto nello standard. – Barry
^ack. Un problema LWG sarebbe appropriato. – Columbo
Di solito la bozza standard è abbastanza buona. Questo è uno di quei casi in cui dovresti guardare la cosa reale. –