¿Las referencias rvalue permiten referencias colgantes?
Si quiso decir "¿Es posible crear referencias de valores r pendientes?", La respuesta es sí. Su ejemplo, sin embargo,
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á perfectamente bien. Aquí se aplica la misma regla que hace que this example (artículo de Herb Sutter) también sea seguro. Si inicializa una referencia con pure rvalue, la vida útil del objeto temporal se amplía a la duración de la referencia. Sin embargo, todavía puedes producir referencias colgantes. Por ejemplo, esto ya no es seguro:
int main()
{
string&& danger = std::move(middle_name()); // dangling reference !
return 0;
}
Debido std::move
devuelve un string&&
(que es no un pura rvalue) la regla que se extiende de por vida del temporal no se aplica. Aquí, std::move
devuelve un llamado xvalue. Un xvalue es solo una referencia rvalue sin nombre. Como tal, podría referirse a cualquier cosa y es básicamente imposible adivinar a qué se refiere una referencia devuelta sin mirar la implementación de la función.
me desconcierta que puede usar && en el lado izquierdo en absoluto, ¿cuándo sería útil? –
@Viktor: una referencia rvalue puede vincularse a un temporal y seguir siendo modificable. Ej 'int && variable_or_dummy = modify_var? move (var): int(); ' – Potatoswatter
Al nombrar un valor r, se convierte en un valor l, por lo que en el' peligro 'principal es un valor l. la validez o valor es propiedad de una expresión –