Продление времени жизни временного объекта при возврате из функции
Будет ли корректен такой код:
A Foo ()
{
A a;
return a;
}
int main ()
{
const A &a = Foo ();
//some work with a
return 0;
}
Я всегда считал, что будет, но тут возникло сомнение, объект создан в функции, что произойдёт при его возврате ? Возможно, при выходе из функции вызовутся деструкторы и A a умрёт, а продление жизни возникает лишь при более простой инициализации:
const A &a = A ();
Ответы (2 шт):
Работать будет.
Но здесь возможно 2 варианта:
- Если сработает оптимизация (должна сработать начиная с С++ 17) то будет создание 1 объекта и возврат его из функции. Есть там правда некоторые ограничения. Это называется Return Value Optimization (RVO). статья RVO/NRVO
- Если оптимизации не будет, то вернется копия объекта. Т.е. будет создан объект, создан второй объект через конструктор копирования, первый объект уничтожен, второй объект вернут из функции.
Я всегда считал, что будет, но тут возникло сомнение, объект создан в функции, что произойдёт при его возврате ?
Вы смешали два случая, которые практически не имеют отношения друг к другу. Первое - константная ссылка продляет время жизни временного объекта, точка. То есть:
A foo();
int main()
{
const A &a = foo();
}
это валидный код вне зависимости от того, что там происходит внутри foo()
Второй случай, что происходит в коде:
A foo()
{
A a;
return a;
}
Это зависит от некоторых параметров, которые к данному вопросу не имеют отношения. В любом случае либо сам объект a либо его копия будут возвращены в виде временного объекта. На валидность кода это не влияет.