Le move semantics et l'opérateur && sont, je trouve, un concept assez complexe à mettre en oeuvre alors que le besoin de base est assez élémentaire.
A y bien regarder, l'opérateur && ne me parait utile que dans un contexte générique (template).
Voici un bout de code:
Aux endroids (1) et (2) ça ne compile pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 void fooint(int && i) { std::cout << i << std::endl; } void foostr(std::string && s) { std::cout << s << std::endl; } template<typename T> void fooT(T && t) { std::cout << t << std::endl; } template<> void fooT(int && t) { std::cout << t << std::endl; } int main() { int i = 25; fooint(i);//(1) 'void fooint(int &&)': cannot convert argument 1 from 'int' to 'int &&' fooint(i + 10); fooT(i);//(3) OK ! fooT<int>(i);//(2) 'void fooT<int>(int &&)': cannot convert argument 1 from 'int' to 'int &&' std::string s("abc", 3); foostr(s);//(1) 'void foostr(std::string &&)': cannot convert argument 1 from 'std::string' to 'std::string &&' foostr(s + "10"); fooT(s);//(3) OK ! return 0; }
En (1) car passer une lvalue par rvalue n'est pas autorisée.
En (2) non plus, même en cas de spécialisation de template.
Il n'y a que en (3) qu'on peut passer une lvalue en rvalue, en template "pure" si j'ose dire.
Et d'une manière générale, il n'y a que dans les templates qu'on peut passer une lvalue ou une rvalue en rvalue.
Ai-je bien tout compris ?
Merci![]()
Partager