C++ benannte Anforderungen: MoveInsertable (seit C++11)
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
|
| 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 |