Warum leitet der Vektor move ctor kein noexcept () ab?

9

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

    
Orient 22.04.2013, 07:36
quelle

1 Antwort

4

Ich nehme an, dass mit "Konstruktor für std::vector mit benutzerdefiniertem Zuordner" mein Zuweisungs-erweiterter Verschiebungskonstruktor gemeint ist, d. h. dieser Konstruktor:

%Vor%

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.

    
Jonathan Wakely 22.04.2013, 12:13
quelle

Tags und Links