1) I reference in generale sono dei puntatori camuffati, per cui puoi restituire un reference esattamente nelle stesse occasioni in cui puoi restituire un puntatore, ossia quando sei sicuro che la variabile a cui punta continuerà ad esistere dopo che la funzione è terminata.
2) Quando non devi modificare i parametri usa const, se li devi modificare non usarlo. In generale si usa un const reference quando non si deve modificare l'oggetto passato e si vogliono evitare gli effetti del passaggio per valore (costruttore di copia/copia bit-a-bit, distruttore all'uscita).