Non c'è nulla di così strano... un riferimento non è altro che un alias per un'altra variabile, o, se preferisci, un puntatore nascosto. Se restituisco un riferimento ad una variabile il valore restituito dalla funzione di fatto si riferirà ad un'altra variabile (quella che ho messo a destra del return nella funzione), e modificando il valore restituito dalla funzione la modifica si ripercuoterà sulla variabile.
In genere i reference come valori restituiti si usano nei metodi delle classi, dato che ovviamente la variabile a cui si riferisce il reference deve avere un tempo di vita superiore a quello della funzione (non ha senso cioè restituire un reference ad una variabile locale, dato che questa muore quando termina la funzione); i reference come valori restituiti sono spesso usati per i cosiddetti "accessors" (piccole funzioni che consentono l'accesso a membri privati di una classe):
codice:class Test { private: int a; public: int & GetA() { return a; } }; Test istanza; istanza.GetA() = 10; // ora il membro a di istanza vale 10 cout<<istanza.GetA(); // visualizza 10