Поведение не определено. Вы не должны возвращать ссылки на локальные переменные.
Функция хорошо сформирована (синтаксически корректна), но как только функция возвращается, возвращаемая ссылка становится недействительной и не может быть использована.
Для пояснения: рассматриваемый код не вызывает никакого неопределенного поведения. Вы можете спокойно вызывать эту функцию, пока не используете возвращаемое значение, например, вот это:
test_function(); // ok
Однако, если вы попытаетесь использовать возвращаемое значение (например, инициализировать им другую ссылку или скопировать ссылку в другой объект), то вы вызовете неопределенное поведение, потому что время жизни ссылки (объекта x
) закончится (x
будет уничтожен при возврате функции, потому что это автоматическая переменная):
std::vector<int>& vec = test_function(); // undefined
std::vector<int> vec = test_function(); // undefined
Да, это верно, но если вы попытаетесь использовать возвращаемое значение, вы получите неопределенное поведение.
Вы не можете вернуть ссылку на локальную переменную по той же причине, по которой вы не можете вернуть указатель на локальную переменную, потому что при возврате из функции эти локальные переменные освобождаются и, следовательно, ссылка или указатель становятся недействительными.