Продление жизни локального объекта
Возможно ли продлить жизнь локального объекта без копирования. Например, дано:
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 шт):
Продление жизни объекта может производиться только для временных объектов и только в пределах области видимости их появления. В выражении string && r2{foo2()}; как раз появляется анонимный временный объект, создаваемый функцией foo2 и его жизнь будет продлена пока r2 не покинет область видимости. То же произойдет и при связывании временного объекта с lvalue ссылкой на const объект string const & r3{foo2()};. Связывание временного объекта с lvalue ссылкой на не const объект запрещено.
Функция foo1 просто возвращает невалидную ссылку на локальный объект, вышедший из области видимости. Возврат ссылки на локальную (не статическую) переменную - всегда ошибка. Функция foo2 возвращает временный объект, копирование / перемещение которого компилятор радостно оптимизирует, сразу используя место для размещения объекта, предоставленное функцией foo3. Но продления жизни локальных объектов, вышедших из области видимости не происходит ни при каких условиях.