Bonjour tout le monde, je suis en train de lire le livre "Effective Modern c++" de Scott Meyers et je me rends compte qu'il me manque des connaissances de base concernant les rvalue et lvalue.

J'aimerais donc savoir si j'ai bien compris:
Une rvalue n'est pas modifiable contrairement à une lvalue.

on ne pas écrire:

En c++14 on peut passer les rvalue en paramètre, par exemple si on prend cette fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
void foo(int && number);
number est une rvalue.

1) pourquoi ce code compile?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
void foo(int&& number)
{
  number = 5;
}
2) Ensuite, quel est l'intérêt (via std::move) de transformer une lvalue en rvalue? pourquoi ne pas faire une fonction qui prend en paramètre une lvalue?

3) Je n'arrive pas à comprendre la différence entre copy-construct et move-construct:

Soit deux constructeur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
widget(const int &a):_A(a) {}
widget(int &&a): _A(std::move(a)) {}
Je ne comprends pas la différence entre ces deux constructeur sachant que le move ne fait pas de "move" mais uniquement un cast en rvalue.

Merci d'avance . J'aurais surement d'autres questions, mais qui se base sur ces trois premières questions.