A la base, une rvalue est "simplement" quelque chose qui peut se trouver à droit de l'opérateur =.
Donc : non toutes les rvalue ne sont pas des temporaires non nommés ;)
Les choses deviennent intéressantes lorsque l'on s'intéressent aux
rvalue references
Parce que, pour qu'il y ait
rvalue reference, il faut qu'il y ait un objet temporaire.
Mais objet temporaire ne veux pas forcément dire non nommé:
Code:
1 2 3 4 5 6 7 8 9 10
| std::string && foo(/* params */)
{
std::string temp;
/* ... */
return temp;
}
std::string && bar()
{
retrun "hello world";
} |
La chaine (constante) "hello world" dans bar provoquera la création d'une std::string temporaire non nommée, ne pouvant donc être renvoyée que par valeur ou par rvalue reference.
Mais, a priori, temp est aussi un temporaire (dans le contexte de la fonction) dans le sens où la std::string sera détruite lorsque l'on sortira de la portée dans laquelle elle a été déclarée.