La funzione è ben formata (sintatticamente corretta), ma non appena la funzione restituisce, il riferimento restituito non è valido e non può essere utilizzato.
Per chiarire: il codice in questione fa non invoca un comportamento non definito. È possibile chiamare in modo sicuro questa funzione fino a quando non si utilizza il valore di ritorno, ad esempio, questo è valido:
test_function(); // ok
Tuttavia, se si tenta di utilizzare il valore di ritorno (vale a dire, inizializzare un altro riferimento ad esso o copiare il referente in un altro oggetto), allora si invocherà un comportamento indefinito perché la durata del referente (l'oggetto x
) sarà finita (x
saranno distrutti quando la funzione restituisce perché è una variabile automatica):
std::vector<int>& vec = test_function(); // undefined
std::vector<int> vec = test_function(); // undefined
fonte
2010-07-15 03:42:50
Dannazione, bastonatemi! – Anthony
Il codice che viene mostrato non contiene (da solo) alcun comportamento indefinito. L'UB si sarebbe verificato in un altro codice che chiama questa funzione. –