La función está bien formada (sintácticamente correcta), pero tan pronto como la función retorna, la referencia devuelta no es válida y no se puede usar.
Para aclarar: el código en cuestión hace no invoca cualquier comportamiento indefinido. Puede llamar de forma segura esta función, siempre y cuando no se utiliza el valor de retorno, por ejemplo, esto es válido:
test_function(); // ok
Sin embargo, si se intenta utilizar el valor de retorno (es decir, inicializar otra referencia con ella o copia el referente en otro objeto), entonces invocará un comportamiento indefinido debido a que el tiempo de vida del referente (el objeto x
) habrá terminado (x
serán destruidos cuando la función devuelve porque es una variable automática):
std::vector<int>& vec = test_function(); // undefined
std::vector<int> vec = test_function(); // undefined
¡Maldita sea, pásame! – Anthony
El código que se muestra no contiene (por sí solo) ningún comportamiento indefinido. El UB pasaría en otro código que llama a esta función. –