2013-04-22 12 views
9

Warum bewegen Konstruktor für std::vector mit benutzerdefinierten Zuordner nicht noexcept() aus Allokator Verhalten ableiten?Warum Vektor Umzug ctor nicht ein noexcept() abzuleiten?

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).

+0

weil es Leute geben könnte, die von einem Move-Konstruktor werfen könnten –

+4

Könnten Sie etwas Code zur Verfügung stellen? Ich verstehe nicht, was du meinst. Der "noexcept" auf was der "Allokator Verhaltensweisen"? –

+0

Angenommen, die "Verhaltensweisen des Zuordners" bedeuten einen booleschen Ausdruck über "noexcept (allocator :: construct (...))" und "noexcept (allocator :: destroy (...))". – Orient

Antwort

4

Ich gehe davon aus, dass durch „Konstruktor für std::vector mit benutzerdefinierten allocator bewegen“ Meinen Sie die Allocator-extended Bewegung Konstruktor dh dieser Konstruktor:

vector(vector&& v, const allocator_type& a); 

Der Hauptgrund ist, dass, wenn v.get_allocator() != a dann der Konstruktor zuweisen muss mehr Speicher, der bad_alloc werfen könnte. Es gibt keine Möglichkeit, zur Kompilierungszeit zu wissen, ob zwei Zuordner eines bestimmten Typs immer gleichberechtigt sind oder nicht (ich habe dies als Fehler gemeldet, siehe LWG 2108).

N.B. Der Standard erfordert diesen Konstruktor oder der vector(vector&&)-Move-Konstruktor nicht noexcept sein.

+0

In diesem Fall könnte "der Standard nicht erforderlich" wie "der Standard erlaubt nicht" korrigiert werden, richtig? – mcmcc

+0

@mcmcc, nein, das ist nicht korrekt. Implementierungen können Ausnahmenspezifikationen hinzufügen oder verschärfen, so dass es konform ist, "noexcept (true)" für die Spezialisierungen mit einem Zuordnungstyp hinzuzufügen, von dem bekannt ist, dass er immer gleich vergleicht (z. B. "std :: allocator"). –