Restituisce un riferimento al membro privato.
In molti casi questo è auspicabile, ma occorre prestare attenzione.
IMO generalmente non è una buona idea restituire una copia di un oggetto interno che non è un tipo integrale, per motivi di prestazioni generali. Sì, lo so, l'ottimizzazione prematura non è buona, ma non si tratta di ottimizzazione, è solo una buona pratica di performance che consente al chiamante di determinare le implicazioni in termini di prestazioni; se vuole una copia, non può semplicemente dichiarare la variabile a cui la sta assegnando come riferimento.
Ci sono 2 regole generali che uso qui:
1) Se non si desidera che il chiamante sia in grado di modificare l'oggetto privato direttamente, dichiarare il valore di ritorno come riferimento const:
inline const string& GetLabel() const{ return m_Label; }
2) Un chiamante non deve mai memorizzare il riferimento restituito da un metodo di classe, deve essere utilizzato solo localmente in cui l'oggetto padre è garantito nell'ambito.
Se per qualche motivo è necessario che i chiamanti siano in grado di memorizzare un riferimento agli oggetti interni, utilizzare invece i puntatori intelligenti.
In effetti, probabilmente si desidera _both_ le versioni const e non const. – ildjarn
@ildjam Questo è solo parzialmente vero. Solitamente si desidera fornire solo la versione const, a meno che non si abbia un motivo per voler consentire ai chiamanti di modificare direttamente l'oggetto. Se fornisci la versione non const, dovresti anche fornire la versione const, in modo che tu possa ancora ottenere l'accesso di sola lettura dove hai un riferimento const all'oggetto padre. – Gerald
@Gerald: Scusate, dovrei chiarire - volevo dire che, se volete la versione non-const che restituisce un riferimento, allora quasi certamente volete anche una versione const. – ildjarn