Продление времени жизни временного объекта путем связывания с ним ссылки на константное значение
Рассмотрим следующий код:
Object GetObject()
{
// ...
return Object{someValue};
}
int main(int argc, char** argv)
{
const Object& object = GetObject();
object.GetName();
return 0;
}
Насколько мне известно, Стандарт позволяет нам создавать ссылку на константный объект и связывать эту ссылку со временным значением. Такая ссылка будет держать временный объект (продлевать срок его жизни) до тех пор, пока существует сама ссылка.
А теперь рассмотрим еще один вариант кода:
const Object& GetObject()
{
// ...
return Object{someValue};
}
int main(int argc, char** argv)
{
const Object& object = GetObject();
object.GetName();
return 0;
}
Я не знаю, можно ли так делать или нельзя, но я склоняюсь к тому, что так делать нельзя.
С одной стороны, здесь тоже ссылка на константный объект, но насколько мне известно, возвращение ссылки на локальный объект функции/метода - это большая ошибка.
Мне интуитивно понятно, почему Стандарт позволяет продлевать время жизни временного объекта в первом случае. Такое поведение достаточно безопасно и весьма удобно.
Но я не совсем понимаю, как Стандарт регламентирует второй вариант кода. И почему он его регламентирует именно так.