Ist ein verschobener „std::vector' garantiert leer?
Ist ein verschobener Vektor garantiert leer?
Im Allgemeinen bietet der C-Standard nur minimale Hinweise zum Status von Objekten danach sie wurden verlegt. Wie in N3485 17.6.5.15 [lib.types.movedfrom]/1 angegeben:
Objekte von Typen, die in der C-Standardbibliothek definiert sind, können aus (12.8) verschoben werden. Verschiebungsvorgänge können explizit angegeben oder implizit generiert werden. Sofern nicht anders angegeben, müssen solche verschobenen Objekte in einen gültigen, aber nicht spezifizierten Zustand versetzt werden.
Obwohl diese Bestimmung nicht ausschließt, dass Vektoren diesem Verhalten unterliegen, lässt sie Raum für Interpretationen.
Spezifisches Verhalten des Vektors
Es gibt keine explizite Standardanforderung, die ausschließt, dass der Vektor von der allgemeinen Regel für verschobene Objekte betroffen ist. Angesichts der Anforderungen für die Vektorimplementierung gibt es jedoch begrenzte Optionen:
Bewegungskonstruktor:
- Der Bewegungskonstruktor muss eine konstante Komplexität haben.
- Die einzige Möglichkeit besteht darin, Ressourcen aus dem Quellvektor (v) zu stehlen, um den neuen Vektor zu erstellen und v leer zu lassen.
Zuweisungsoperator verschieben:
- Verhalten hängt vom Allokator des Vektors ab:
Fall Eins:
- allocator_traits::propagate_on_container_move_assignment::value == wahr
- Alle Elemente im Zielvektor (*this) werden zerstört.
- Kapazität wird mithilfe des Allokators von *this freigegeben.
- Allokatoren und Speicherpufferbesitz werden von übertragen v zu *this.
- *this ist normalerweise vor der Verschiebungszuweisung leer.
Fall Zwei:
- allocator_traits< A>::propagate_on_container_move_assignment::value == false und get_allocator() == v.get_allocator()
- Ähnliches Verhalten wie Fall Eins, aber Allokatoren werden nicht verschoben.
- Die Entscheidung zwischen Fall Zwei und Fall drei werden zur Laufzeit erstellt, was sich auf die Anforderungen an T auswirkt.
Fall drei:
- allocator_traits::propagate_on_container_move_assignment ::value == false und get_allocator() != v.get_allocator()
- Allokatoren können nicht verschoben werden und Ressourcen können nicht von v nach *this übertragen werden.
- Die einzige Möglichkeit zur Implementierung Die Verschiebungszuweisung besteht darin, jedes T mithilfe der Zuweisungsoperation einzeln von v nach *this zu verschieben.
- Dafür muss T entweder MoveAssignable oder MoveInsertable sein (abhängig von der Verfügbarkeit von Kapazität und Größe in *this).
Fazit:
Für den Verschiebungskonstruktor des Vektors ist der verschobene Vektor immer leer. Für den Verschiebungszuweisungsoperator ist der verschobene Vektor normalerweise leer, kann aber in bestimmten spezifischen Szenarios, in denen Allokatoren nicht kompatibel sind und T MoveAssignable oder MoveInsertable ist, nicht vorhanden sein.
Das obige ist der detaillierte Inhalt vonIst ein verschobener „std::vector' garantiert leer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert?

GULC: C -Bibliothek von Grund auf neu gebaut

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die?

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher?

eindeutiger Gebrauch und Phrasenfreigabe

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient?

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)?
