Xavier Lamorlette

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

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

Ils doivent être noexcept pour que le type se comporte bien avec les conteneurs et les algorithmes standards (sinon ils sont obligés de faire des copies).

class A {
    A(A && other) noexcept;                // move constructor
    A & operator = (A && other) noexcept;  // 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 de mai 2026.

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.