Это мое предложение:
Если вам нужен доступ только для чтения к объектам, возвращаемым функциями, используйте
const auto& foo = function_1();
Если вы хотите изменить возвращенные объекты или не хотите, чтобы объект мог быть удален какой-либо другой функцией без вашего ведома, сделайте копию.
auto foo = function_1();
Дополнительная информация в ответ на комментарии
Когда следующая программа скомпилирована с g++ -std=c++11 -Wall
#include <iostream>
struct Foo
{
Foo() {}
Foo(Foo const& copy) { std::cout << "In copy constructor\n"; }
};
Foo function_1(){
Foo f;
return f;
}
int main()
{
std::cout << "-------------------------\n";
auto f1 = function_1();
std::cout << "-------------------------\n";
const auto& ref = function_1();
}
Я получаю следующий вывод (без вывода из конструктора).
-------------------------
-------------------------
Когда та же программа компилируется с g++ -std=c++11 -Wall -fno-elide-constructors
Я получаю следующий вывод.
-------------------------
In copy constructor
In copy constructor
-------------------------
In copy constructor
Если компилятор не поддерживает удаление по умолчанию, дополнительная копия создается при использовании
auto f1 = function_1();