Простые случае можно решить так:
Если объект временный то перемещаем, все равно он умрёт.
Если объект не временный то спокойно возвращаем ссылку.
class A
{
public:
std::string getI() &&
{
return std::move(i);
}
std::string const& getI() &
{
return i;
}
private:
std::string i{ "xyz" };
};
int main()
{
std::cout << A().getI(); // OK, moves the value
std::string const& rvalueI = A().getI(); // OK, extends lifetime of returning value
std::cout << rvalueI;
A a;
std::string const& lvalueI = a.getI(); // OK, lvalue return reference
std::cout << lvalueI;
}
Однако это не решает проблемы возврата ссылки из функции:
std::string const& q()
{
A a;
return a.getI();
}
Есть ли способ предотвратить такую ошибку ?