Copia / sposta l'assegnazione in std :: vector :: erase () e std :: deque :: erase ()


135

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 Tviene chiamato il numero di volte uguale al numero degli elementi cancellati, ma l' operatore di assegnazione del movimento di Tviene 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 Tessere MoveAssignableper erase()il lavoro sia con std::vectore 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 .


14
Sembra un difetto nello standard.
Barry,

4
^ ack. Un problema LWG sarebbe appropriato.
Columbo,

4
Di solito il progetto di norma è abbastanza buono. Questo è uno di quei casi in cui dovresti guardare la cosa reale.
Mark Ransom,

3
@MarkRansom l'attuale fonte dello standard per std :: deque e std :: vector è la stessa della domanda, quindi la probabilità che la versione finale differisca è molto piccola.
Anton Savin,

3
N4141 ha la stessa formulazione di N4140.
Brian,

Risposte:


9

Alla riunione di Lenexa il problema ha ottenuto lo stato immediato con la risoluzione proposta:

Questa formulazione è relativa a N4296.

Modifica 23.3.3.4 [deque.modifiers] / 5 in:

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

Modifica 23.3.6.5 [vector.modifiers] / 4 in:

-4- Complessità : il distruttore di Tviene chiamato il numero di volte uguale al numero degli elementi cancellati, ma l' operatore di assegnazione del movimento di Tviene chiamato il numero di volte uguale al numero di elementi nel vettore dopo gli elementi cancellati.

Cioè, se la risoluzione viene accettata, non ci sarà alcuna menzione speciale dell'assegnazione di spostamento per std::vector::erase, e anche la formulazione per std::deque::eraseverrà chiarita un po '.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.