Heim > Backend-Entwicklung > C++ > Hauptteil

Gibt es Garantien für die Selbstbewegungszuweisung in C 11-Standardbibliotheksfunktionen?

DDD
Freigeben: 2024-11-09 21:27:02
Original
276 Leute haben es durchsucht

Does Self-Move Assignment In C  11 Standard Library Functions Have Any Guarantees?

Selbstbewegungszuweisung in der C 11-Standardbibliothek

Der C 11-Standard umfasst verschiedene Bestimmungen zur Selbstbewegungszuweisung, insbesondere in Verbindung mit dem Standard Bibliothek. Dieser Artikel erläutert diese Bestimmungen und konzentriert sich dabei auf die Auswirkungen der Selbstbewegungszuweisung in Bibliotheksfunktionen.

Der Standard garantiert insbesondere, dass die Implementierung dessen Exklusivität annehmen kann, wenn ein Argument in einer Standardbibliotheksfunktion ein R-Wert-Referenzparameter ist . Dies bedeutet, dass die Implementierung den Code auf der Grundlage des Verständnisses optimieren kann, dass das übergebene Objekt nicht durch die Funktion geändert wird.

Im Kontext der Selbstbewegungszuweisung hat diese Garantie eine bemerkenswerte Auswirkung. Betrachten Sie beispielsweise die folgende Funktion:

template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
  v = std::move(v);
  return v;
}
Nach dem Login kopieren

Wenn ein L-Wert übergeben wird, wird der Kopierkonstruktor des Vektors aufgerufen und erstellt eine Kopie des Eingabevektors. Aufgrund der Standardbibliotheksgarantie kann die Implementierung des Verschiebungszuweisungsoperators des Vektors jedoch davon ausgehen, dass sein Argument ein PR-Wert ist. Daher ist eine Selbstbewegungszuweisung nicht möglich und das Verhalten der Funktion wird von der Implementierung abhängig.

In den meisten Fällen belässt die Selbstbewegungszuweisung den ursprünglichen Vektor in einem ressourcenlosen Zustand (0 Kapazität). . Wenn der Vektor bereits eine Kapazität von 0 besitzt, wird die Operation zu einer No-Op. Es ist jedoch wichtig zu beachten, dass die Zustände sowohl des ursprünglichen als auch des verschobenen Vektors nach der Selbstbewegungszuweisung nicht spezifiziert sind.

Die jüngsten Aktualisierungen des Standards im Arbeitsentwurf N4618 verdeutlichen diese Bestimmungen weiter und spezifizieren dies im MoveAssignable Anforderungen: Wenn einem Ausdruck (t) ein r-Wert (rv) zugewiesen wird, muss t vor der Zuweisung nur dann den Wert von rv erreichen, wenn t und rv nicht auf dasselbe Objekt verweisen. Ungeachtet dieser Bedingung bleibt der Zustand von rv nach der Zuweisung unbestimmt.

Darüber hinaus wird in einem Hinweis betont, dass rv die Anforderungen der Bibliothekskomponente einhalten muss, die es verwendet, unabhängig davon, ob t und rv auf dasselbe Objekt verweisen.

Das obige ist der detaillierte Inhalt vonGibt es Garantien für die Selbstbewegungszuweisung in C 11-Standardbibliotheksfunktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage