Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: MoveConstructible (seit C++11)

Von cppreference.com
 
 
C++ benannte Anforderungen
 

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

T(rv) Der Wert von T(rv) ist äquivalent zum Wert von rv vor der Initialisierung.

Der neue Wert von rv ist undefiniert.

[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.

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

[bearbeiten] Siehe auch

prüft, ob ein Typ aus einer rvalue-Referenz konstruiert werden kann
(Klassenvorlage) [bearbeiten]
gibt an, dass ein Objekt eines Typs per Move konstruiert werden kann
(Konzept) [bearbeiten]