C++ named requirements: MoveConstructible (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Gibt an, dass eine Instanz des Typs aus einem rvalue -Argument konstruiert werden kann.
Inhaltsverzeichnis |
Anforderungen
Der Typ
T
erfüllt die Anforderungen von
MoveConstructible
wenn
Gegeben
-
rv, ein Rvalue -Ausdruck vom TypT, -
u, eine beliebige Bezeichnung.
Die folgenden Ausdrücke müssen gültig sein und ihre spezifizierten Effekte haben.
| Expression | Post-conditions |
|---|---|
| T u = rv ; |
Der Wert von
u
entspricht dem Wert von
rv
vor der Initialisierung.
Der neue Wert von
|
| T ( rv ) |
Der Wert von
T(rv)
entspricht dem Wert von
rv
vor der Initialisierung.
Der neue Wert von
|
Hinweise
Eine Klasse muss keinen
move constructor
implementieren, um diese Typanforderung zu erfüllen: Ein
copy constructor
, der ein
const T&
-Argument akzeptiert, kann Rvalue-Ausdrücke binden.
Wenn eine
MoveConstructible
Klasse einen Move-Konstruktor implementiert, kann sie auch
Move-Semantik
implementieren, um den Umstand zu nutzen, dass der Wert von
rv
nach der Konstruktion nicht spezifiziert ist.
| Erweiterter Inhalt |
|---|
|
Eine MoveConstructible Klasse impliziert std::is_move_constructible , aber nicht umgekehrt, da std::is_move_constructible nur die Fähigkeit prüft, den Konstruktor mit den korrekten Argumenten aufzurufen, nicht jedoch eine Nachbedingung für den Wert.
Diesen Code ausführen
#include <iostream> struct S { int n; S(int in) : n{in} {} S(S&& other) { n = other.n + 1; } }; static_assert(std::is_move_constructible_v<S>); int main() { S v{1}; std::cout << "v.n = " << v.n << '\n'; S u = std::move(v); // Klasse `S` erfüllt nicht die MoveConstructible-Anforderung // Der Wert von `u` ist NICHT äquivalent zum Wert von `v` vor der `u`-Initialisierung std::cout << "u.n = " << u.n << '\n'; } Ausgabe: v.n = 1 u.n = 2 |
Referenzen
| Erweiterter Inhalt |
|---|
|
Siehe auch
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ aus einer Rvalue-Referenz konstruiert werden kann
(Klassen-Template) |
|
(C++20)
|
spezifiziert, dass ein Objekt eines Typs move-konstruiert werden kann
(Konzept) |