Xavier Lamorlette
std::moveType des values :
&
&&
std::movestd::move est un cast en rvalue.
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
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));
}
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
};
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.