Do références rvalue permettent références ballants?
Si vous vouliez dire « Est-il possible de créer ballants références rvalue » alors la réponse est oui. Votre exemple, cependant,
string middle_name() {
return "Jaan";
}
int main()
{
string&& nodanger = middle_name(); // OK.
// The life-time of the temporary is extended
// to the life-time of the reference.
return 0;
}
est parfaitement bien. La même règle s'applique ici qui rend également this example (article par Herb Sutter) en sécurité. Si vous initialisez une référence avec un pur rvalue, la durée de vie de l'objet tempoary est étendu à la durée de vie de la référence. Vous pouvez toujours produire des références qui pendent, cependant. Par exemple, ce n'est pas plus en sécurité:
int main()
{
string&& danger = std::move(middle_name()); // dangling reference !
return 0;
}
Parce que std::move
renvoie un string&&
(qui est pas un pur rvalue) la règle qui prolonge la durée du temps de l'temporaire ne sont pas applicables. Ici, std::move
retourne un soi-disant xvalue. Un xvalue est juste une référence rvalue non nommée. En tant que tel, il peut se référer à n'importe quoi et il est fondamentalement impossible de deviner à quoi renvoie une référence renvoyée sans regarder l'implémentation de la fonction.
puzzles moi que vous pouvez utiliser && sur le côté gauche du tout, quand cela serait utile? –
@Viktor: Une référence rvalue peut être liée à une variable temporaire et être toujours modifiable. Par exemple 'int && variable_or_dummy = modify_var? move (var): int(); ' – Potatoswatter
Celui que vous appelez un rvalue devient une lvalue donc en danger principal est une lvalue. La valeur ou la lvalueness est une propriété d'une expression. –