2015-02-02 9 views
136

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 di T 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.

+14

Sembra un difetto nello standard. – Barry

+4

^ack. Un problema LWG sarebbe appropriato. – Columbo

+4

Di solito la bozza standard è abbastanza buona. Questo è uno di quei casi in cui dovresti guardare la cosa reale. –

risposta

8

Alla riunione Lenexa la questione got Immediate status con proposta di deliberazione:

Questa formulazione è relativo al N4296.

Change 23.3.3.4 [deque.modifiers]/5 a:

-5- Complessità: Il numero di chiamate al distruttore di T è uguale al numero di elementi cancellati, ma il numero di chiamate all'operatore di assegnazione di T non è altro che il numero minore di elementi prima degli elementi cancellati e il numero di elementi dopo gli elementi cancellati.

Change 23.3.6.5 [vector.modifiers]/4:

-4- Complessità: Il distruttore di T viene chiamato il numero di volte pari al numero degli elementi cancellati, ma la move L'operatore di assegnazione di T è chiamato il numero di volte uguale al numero di elementi nel vettore dopo gli elementi cancellati.

Cioè, se la risoluzione è stata accettata non ci sarà menzione speciale della cessione mossa per std::vector::erase, e anche il testo std::deque::erase sarà chiarito un po '.

Problemi correlati