Anke le funzioni possono restituire riferimenti.
In pratica quando chiami una funzione:

codice:
int i = somma(a,b);
in realtà alla fine di tutte le istruzioni della funzione quel somma(a,b) risulterà solamente un numero esattamente identico a:

codice:
int i = 10;
Ora i riferimenti sai che sono degli indirizzi di memoria in cui un determinato dato è memorizzato. Ma sai che questi indirizzi di memoria sono semplicemente dei numeri che vengono però intesi come indirizzi dal compilatore per via della particolare definizione che hai usato per quella variabile (il famoso puntatore... *nome_var)

Quindi la funzione restituirà "solo" un numero che poi verrà interpretato come riferimento.

Ritornare un riferimento significa ritornare un particolare valore che verrà inteso come indirizzo. E' l'inverso che passare un valore per riferimento.
Pensa se per esempio la funzione dovesse lavorare su una struttura dati molto pesante in termini computazionali... magari una mega matrice... restituire solo l'indirizzo facilita le cose e rende tutto più leggero... alla fin fine è solo un valore! Pensa se invece bisognasse restituire al chiamante ogni singolo elemento della matrice... diventerebbe pesantissimo!!

Spero di esser stato chiaro è aver chiarito un pò i tuoi dubbi!!!

Ciao!