Разрешают ли ссылки rvalue висячие ссылки?
Если вы имели в виду «Можно ли создать висячие ссылки rvalue», тогда ответ - да.Ваш пример, однако,
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;
}
совершенно в порядке.Здесь применяется то же правило, что делает этот пример (статья Херба Саттера) также безопасным.Если вы инициализируете ссылку с pure rvalue , время жизни временного объекта увеличивается до времени жизни ссылки.Тем не менее, вы все еще можете создавать висячие ссылки.Например, это больше не безопасно:
int main()
{
string&& danger = std::move(middle_name()); // dangling reference !
return 0;
}
Поскольку std::move
возвращает string&&
(то есть не a pure rvalue ) правило, которое продлевает срок службы временного, не применяется.Здесь std::move
возвращает так называемое xvalue . xvalue - это просто неназванная ссылка на rvalue.Как таковой, он может ссылаться на что угодно, и в принципе невозможно угадать, на что ссылается возвращаемая ссылка, не глядя на реализацию функции.