Namespaces
Variants

C++ named requirements: MoveConstructible (since C++11)

From cppreference.net
C++ named requirements

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 Typ T ,
  • 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 rv ist nicht spezifiziert.

T ( rv ) Der Wert von T(rv) entspricht dem Wert von rv vor der Initialisierung.

Der neue Wert von rv ist nicht spezifiziert.

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.

#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
  • C++23 Standard (ISO/IEC 14882:2024):
  • 16.4.4.2 Template argument requirements [utility.arg.requirements]

Siehe auch

prüft, ob ein Typ aus einer Rvalue-Referenz konstruiert werden kann
(Klassen-Template)
spezifiziert, dass ein Objekt eines Typs move-konstruiert werden kann
(Konzept)