Maison >développement back-end >C++ >Quand un paramètre de référence Rvalue peut-il se lier à un argument Lvalue en C ?
Pourquoi un paramètre de référence Rvalue peut se lier à un argument Lvalue
En C, les références rvalue sont censées être liées à des rvalues. Cependant, il existe des cas où un paramètre de référence rvalue peut correspondre à un argument lvalue, ce qui surprend de nombreux programmeurs.
Considérez le code suivant :
void f(T&&); // #1 void f(T&); // #2
Normalement, nous nous attendrions à ce que f(T&&) surcharge à appeler lors du passage d'une rvalue, et surcharge f(T&) pour les lvalues. Cependant, le comportement est différent :
void g(T&& t) { f(t); // calls #2 }
Dans cet exemple, la surcharge f(T&) est appelée même si t est une rvalue. Cela se produit parce que, malgré son type de référence rvalue, t est toujours considéré comme une lvalue.
La justification :
Les Rvalues sont généralement des entités sans nom ou celles qui perdront leur noms sous peu. Les références Rvalue ne peuvent se lier qu’à des rvalues. Cependant, t a un nom et sa durée de vie n'expirera pas immédiatement.
Le type T&& :
T&& est le type d'une référence rvalue. Bien qu'il ne puisse se lier qu'à des rvalues, il se comporte autrement comme une lvalue de type rvalue référence. Sa nature de référence rvalue n'a d'importance que lors de sa construction et lors de l'exécution de decltype(variable_name).
Le rôle de std::move():
std::move( ) renvoie une référence rvalue en effectuant un static_cast
Le pertinent Règles :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!