Bei der Beantwortung einer weiteren Frage bin ich auf leicht unterschiedliche Formulierungen für std::vector::erase()
und gestoßen std::deque::erase()
.
Dies ist, was C ++ 14 über std::deque::erase
( [deque.modifiers]/4-6
, Hervorhebung von mir) sagt :
Effekte: ...
Komplexität: Die Anzahl der Aufrufe des Destruktors entspricht der Anzahl der gelöschten Elemente, aber die Anzahl der Aufrufe des Zuweisungsoperators ist nicht größer als die Anzahl der Elemente vor den gelöschten Elementen und die Anzahl der Elemente nach dem gelöschte Elemente.
Auslöser: Nichts, es sei denn, der Kopierkonstruktor, der Verschiebungskonstruktor, der Zuweisungsoperator oder der Verschiebungszuweisungsoperator von lösen eine Ausnahme aus
T
.
Und hier ist, was es über std::vector::erase
( [vector.modifiers]/3-5
) sagt :
Effekte: ...
Komplexität: Der Destruktor von
T
wird als die Anzahl bezeichnet, die der Anzahl der gelöschten Elemente entspricht, aber der Verschiebungszuweisungsoperator vonT
wird als die Häufigkeit bezeichnet, die der Anzahl der Elemente im Vektor nach den gelöschten Elementen entspricht.Auslöser: Nichts, es sei denn, der Kopierkonstruktor, der Verschiebungskonstruktor, der Zuweisungsoperator oder der Verschiebungszuweisungsoperator von lösen eine Ausnahme aus
T
.
Wie Sie sehen können, sind die Ausnahmespezifikationen für beide gleich, std::vector
es wird jedoch ausdrücklich erwähnt, dass der Verschiebungszuweisungsoperator aufgerufen wird.
Es gibt auch Voraussetzung für T
sein MoveAssignable
für erase()
die Arbeit mit beiden std::vector
und std::deque
(Tabelle 100), aber dies bedeutet nicht , das Vorhandensein des Umzugs Zuweisungsoperator: eine Kopie Zuweisungsoperator definieren kann, und nicht bewegen Zuweisungsoperator definieren, und diese Klasse sein MoveAssignable
.
Nur für den Fall, ich habe mich bei GCC und Clang erkundigt und std::vector::erase()
rufe tatsächlich den Kopierzuweisungsoperator auf, wenn es keinen Verschiebungszuweisungsoperator gibt, und std::deque::erase()
mache dasselbe ( DEMO ).
Die Frage ist also: Habe ich etwas verpasst oder ist dies ein (redaktionelles) Problem im Standard?
Update: Ich habe eine LWG-Ausgabe Nr. 2477 eingereicht .
quelle
Antworten:
Bei der Lenexa-Sitzung erhielt das Problem mit der vorgeschlagenen Lösung den Status "Sofort" :
Das heißt, wenn der Beschluss angenommen wird, wird die Verschiebungszuweisung für nicht besonders erwähnt
std::vector::erase
, und auch der Wortlaut fürstd::deque::erase
wird ein wenig geklärt.quelle