Warum verschieben Konstruktor für std::vector
mit benutzerdefiniertem Zuordner nicht noexcept()
aus dem Verhalten des Zuordners?
Dies führt dazu, dass die Klasse, die einen solchen Vektor einkapselt, nicht den (anderen) Vektor bilden kann, der normalerweise in einigen <algorithm>
s verschoben werden kann. Auch wenn der zugrunde liegende Typ die erforderlichen Anforderungen erfüllt (MoveInsortable und DefaultInsertable).
Ich nehme an, dass mit "Konstruktor für std::vector
mit benutzerdefiniertem Zuordner" mein Zuweisungs-erweiterter Verschiebungskonstruktor gemeint ist, d. h. dieser Konstruktor:
Der Hauptgrund ist, dass, wenn v.get_allocator() != a
, der Konstruktor mehr Speicher zuweisen muss, was bad_alloc
auslösen könnte. Es gibt keine Möglichkeit zur Kompilierzeit zu wissen, ob zwei Zuweiser eines bestimmten Typs immer gleich oder nicht vergleichen (ich habe dies als Defekt gemeldet, siehe LWG 2108 ).
N.B. Der Standard erfordert nicht, dass dieser Konstruktor oder der vector(vector&&)
move -Konstruktor noexcept
ist.
Tags und Links c++ c++11 move-semantics g++