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:
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;
}
Aux endroids (1) et (2) ça ne compile pas.
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