Продление жизни локального объекта

Возможно ли продлить жизнь локального объекта без копирования. Например, дано:

string& foo1()
{
    string tmp("hello");
    return tmp;
}
string foo2()
{
    string tmp("hello");
    return tmp;
}
string foo3()
{
    string&& r1 = foo1(); // ошибка.
    string&& r2 = foo2(); // объект будет жить в пределах этих скобок.
}

Если я правильно понял, то в данном участке string&& r2 = foo2(); // объект будет жить в пределах этих скобок произойдет копирование локального объекта tmp из функции foo2(). Возможно ли как-нибудь обойтись без копирования при помощи rvalue ссылок или еще чего-нибудь?


Ответы (1 шт):

Автор решения: user7860670

Продление жизни объекта может производиться только для временных объектов и только в пределах области видимости их появления. В выражении string && r2{foo2()}; как раз появляется анонимный временный объект, создаваемый функцией foo2 и его жизнь будет продлена пока r2 не покинет область видимости. То же произойдет и при связывании временного объекта с lvalue ссылкой на const объект string const & r3{foo2()};. Связывание временного объекта с lvalue ссылкой на не const объект запрещено.

Функция foo1 просто возвращает невалидную ссылку на локальный объект, вышедший из области видимости. Возврат ссылки на локальную (не статическую) переменную - всегда ошибка. Функция foo2 возвращает временный объект, копирование / перемещение которого компилятор радостно оптимизирует, сразу используя место для размещения объекта, предоставленное функцией foo3. Но продления жизни локальных объектов, вышедших из области видимости не происходит ни при каких условиях.

→ Ссылка