Как только функция завершена, все объявленные в ней объекты уничтожаются.Поэтому, возвращая ссылку из функции, вы рискуете получить вызов удаленного объекта.Давайте рассмотрим типичный пример:
// don't do that!!!
std::string& get_str()
{
std::string s = "abc";
return s;
}
int main()
{
string &s = get_str();
// "abc"-string already destoyed at this moment
std::cout << s; // attempt to deleted string: undefined behavior
}
Следовательно, опасно возвращать ссылки на локальные объекты из функций, поскольку это может включать доступ к удаленному объекту (неопределенное поведение).Хотя технически возврат объекта (не локальный) ссылка возможна и часто используется.Например:
std::string& get_s()
{
static std::string s = "abc";
return s;
}
int main()
{
std::string &s = get_s();
std::cout << s; // that's OK
}