C++ benannte Anforderungen: MoveConstructible (seit C++11)
Gibt an, dass eine Instanz des Typs aus einem Rvalue-Argument konstruiert werden kann.
Inhalt |
[bearbeiten] Anforderungen
Der Typ T erfüllt MoveConstructible, wenn
Gegeben
-
rv, ein Rvalue-Ausdruck vom TypT, -
u, ein beliebiger Bezeichner.
Die folgenden Ausdrücke müssen gültig sein und ihre angegebenen Effekte haben.
| Ausdruck | Nachbedingungen |
|---|---|
| T u = rv; | Der Wert von u ist äquivalent zum Wert von rv vor der Initialisierung.Der neue Wert von |
| T(rv) | Der Wert von T(rv) ist äquivalent zum Wert von rv vor der Initialisierung.Der neue Wert von |
[bearbeiten] Hinweise
Eine Klasse muss keinen Move-Konstruktor implementieren, um diese Typanforderung zu erfüllen: Ein Kopierkonstruktor, der ein const T&-Argument annimmt, kann Rvalue-Ausdrücke binden.
Wenn eine MoveConstructible-Klasse einen Move-Konstruktor implementiert, kann sie auch Move-Semantik implementieren, um die Tatsache auszunutzen, dass der Wert von rv nach der Konstruktion undefiniert ist.
| Erweiterter Inhalt |
|---|
|
Eine MoveConstructible-Klasse zu sein, impliziert std::is_move_constructible, aber nicht umgekehrt, da std::is_move_constructible nur die Möglichkeit prüft, den Konstruktor mit den richtigen Argumenten aufzurufen, nicht den Wert der Nachbedingung. Führen Sie diesen Code aus #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); // Class `S` doesn't satisfy a MoveConstructible requirement // The value of `u` is NOT equivalent to the value of `v` before the `u` initialization std::cout << "u.n = " << u.n << '\n'; } Ausgabe v.n = 1 u.n = 2 |
[bearbeiten] Referenzen
| Erweiterter Inhalt |
|---|
|
[bearbeiten] Siehe auch
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ aus einer rvalue-Referenz konstruiert werden kann (Klassenvorlage) |
| (C++20) |
gibt an, dass ein Objekt eines Typs per Move konstruiert werden kann (Konzept) |