Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: MoveInsertable (seit C++11)

Von cppreference.com
 
 
C++ benannte Anforderungen
 

Gibt an, dass ein Objekt des Typs in uninitialisierten Speicher aus einem R-Wert dieses Typs mit einem bestimmten Allocator konstruiert werden kann.

Inhalt

[bearbeiten] Anforderungen

Gegeben die folgenden Typen, Werte und Ausdrücke

Typ Definition
T ein Objekttyp
A ein Allokator-Typ
X ein Containertyp, der alle folgenden Bedingungen erfüllt
  • X::value_type ist dasselbe wie T.
  • X::allocator_type ist dasselbe wie std::allocator_traits<A>::rebind_alloc<T>.
Wert Definition
m ein lvalue vom Typ A
p ein Zeiger vom Typ T*
Ausdruck Definition
rv ein Ausdruck, der einen R-Wert vom Typ T bezeichnet
expr std::allocator_traits<A>::construct(m, p, rv)

T ist MoveInsertable in X, wenn alle folgenden Bedingungen erfüllt sind

  • expr ist wohlgeformt.
  • Unmittelbar nach der Auswertung von expr ist der Wert von *p äquivalent zum Wert von rv vor der Auswertung.

[bearbeiten] Hinweise

Wenn A std::allocator<T> ist, ruft dies Placement new auf, wie durch ::new((void*)p) T(rv)(bis C++20)std::construct_at(p, rv)(seit C++20). Dies erfordert im Wesentlichen, dass T verschiebbar ist.

Wenn std::allocator<T> oder ein ähnlicher Allocator verwendet wird, muss eine Klasse keinen Verschiebekonstruktor implementieren, um diese Anforderung zu erfüllen: Ein Kopierkonstruktor, der ein const T& Argument annimmt, kann R-Wert-Ausdrücke binden. Wenn eine MoveInsertable-Klasse einen Verschiebekonstruktor implementiert, kann sie auch Verschiebesemantik implementieren, um die Tatsache zu nutzen, dass der Wert von rv nach der Konstruktion nicht spezifiziert ist.

Obwohl bis C++23 gefordert war, dass ein angepasster construct beim Konstruieren von Elementen von std::basic_string verwendet wird, haben alle Implementierungen nur den Standardmechanismus genutzt. Die Anforderung wurde durch P1072R10 korrigiert, um die bestehende Praxis anzupassen.

[bearbeiten] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2177 C++11 Die Auswertung von expr hatte keine Nachbedingung hinzugefügt

[bearbeiten] Siehe auch

CopyInsertable