Xavier Lamorlette
Sommaire :
std::move
Type des values :
&
&&
std::move
std::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));
}
class A {
A(A && other); // move constructor
A & operator = (A && other); // 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 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.