La tua domanda è in termini C++, non in termini di progettazione. C++ supporta le cose in un modo perché ha senso in termini di design. Il C++ ti permette di fare molte cose, ma se vuoi fare del buon software con esso non puoi limitarti a semplici regole C++ letterali, devi andare oltre. In pratica significa che finisci per creare le tue regole.
Nel tuo caso, beh, non sceglierei mai la variante di riferimento se non avessi effettivamente modificato la variabile nella funzione.
Se si adottano tali "regole" per se stessi, allora si vede immediatamente perché la funzione ref non si lega: qual è il punto, in primo luogo, di cambiare una costante allentata?
Se si apportano le giuste regole, si vedrà che sono splendidamente supportate dal C++. Come ... la funzione cambia un oggetto: passa il riferimento non const. Nessun cambiamento? const ref. Opzionale? puntatore const. Acquisisci la gestione dei mem? puntatore non-const.
Si noti che questo è solo l'inizio, soprattutto quando entra in gioco il multi-threading. Devi aggiungere cose al "contratto" della funzione. Esempio per const ref: l'oggetto deve rimanere 'vivo' dopo la chiamata? L'oggetto può cambiare durante la chiamata? E così via.
fonte
2015-02-07 14:16:38
_ "Come chiamare il foo2 che passa i parametri di riferimento?" _ Dargli un riferimento? –
[Il compilatore si lamenterà dell'ambiguità] (http://ideone.com/W5eLdq) se stai tentando di utilizzare la chiamata ambigua. –
Grazie a tutti, il problema risolto – kchpchan