Xavier Lamorlette

C++ : Références Rvalue et Move

Sommaire :

Type des values

Type des values :

std::move

std::move est un cast en rvalue.

Rvalue reference comme argument de fonction

Lorsque l'argument d'une fonction est une rvalue reference :

void toto(A && arg) {
    …
    arg = …
    …
}

toto(A());

A a;
toto(a);  // erreur de compilation : cannot bind rvalue reference of type 'A&&' to lvalue of type 'A'
toto(std::move(a));  // OK

Rvalue reference comme argument template de fonction

Lorsque l'argument template d'une fonction est une rvalue reference :

On appelle cela une forwarding reference ou universal reference. Cf Effective Modern C++ - Item 24 - Distinguish universal references from rvalue references .

Si la fonction template doit en appeler une autre, comme à l'intérieur de la fonction template l'argument est une lvalue, il faut utiliser std::forward pour préserver l'universalité de la référence :

template <typename T>
void tata(T && arg) {
    ...
}

template <typename T>
void toto(T && arg) {
    tata(std::forward<T>(arg));
}

Move constructor et move assignment constructor

class A {
    A(A && other);                // move constructor
    A & operator = (A && other);  // move assignment operator
};

Surcharges

Les “ref-qualifiers” permettent de définir des surcharges de méthodes, comme les “cv-qualifiers” (cv: const / volatile). Exemple :

class Foo {
public:
    Bar & get() & {
        return bar;
    }
    const Bar & get() const & {
        return bar;
    }
    Bar && get() && {
        return std::move(bar);
    }
private:
    Bar bar;
};

La dernière mise à jour de cette page date d'avril 2021.

Le contenu de ce site est, en tant qu'œuvre originale de l'esprit, protégé par le droit d'auteur.
Pour tout commentaire, vous pouvez m'écrire à xavier.lamorlette@gmail.com.