C++ named requirements: MoveInsertable (since C++11)
Spezifiziert, dass ein Objekt des Typs aus einem Rvalue dieses Typs durch einen gegebenen Allokator in nicht initialisierten Speicher konstruiert werden kann.
Inhaltsverzeichnis |
Anforderungen
Gegeben die folgenden Typen, Werte und Ausdrücke:
| Typ | Definition |
T
|
ein Objekttyp |
A
|
ein Allokator-Typ |
X
|
ein Container-Typ, 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 Rvalue 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 entspricht der Wert von * p dem Wert von rv vor der Auswertung.
Hinweise
Wenn
A
ein
std::
allocator
<
T
>
ist, dann 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 effektiv, dass
T
move-konstruierbar ist.
Falls
std::
allocator
<
T
>
oder ein ähnlicher Allokator verwendet wird, muss eine Klasse keinen
Move-Konstruktor
implementieren, um diese Typanforderung zu erfüllen: Ein
Kopierkonstruktor
, der ein
const
T
&
-Argument akzeptiert, kann Rvalue-Ausdrücke binden. Falls eine
MoveInsertable
-Klasse einen Move-Konstruktor implementiert, kann sie ebenfalls
Move-Semantik
implementieren, um den Umstand zu nutzen, dass der Wert von
rv
nach der Konstruktion nicht spezifiziert ist.
Obwohl es bis C++23 erforderlich war, dass benutzerdefinierte
construct
verwendet werden, wenn Elemente von
std::basic_string
konstruiert werden, haben alle Implementierungen nur den Standardmechanismus verwendet. Die Anforderung wurde durch
P1072R10
korrigiert, um der bestehenden Praxis zu entsprechen.
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2177 | C++11 | Die Auswertung von expr hatte keine Nachbedingung | hinzugefügt |
Siehe auch
| CopyInsertable |