2010-12-28 2 views
11

Ho bisogno di scrivere una classe il cui costruttore prende un riferimento costante a un oggetto e lo memorizza localmente.C++: riferimento const non temporaneo

Per evitare errori più comuni che posso prevedere, mi piacerebbe accettare solo riferimenti a non temporaneo (es .: riferimenti a lvalue).

Come posso scrivere una funzione che richiede riferimenti continui solo temporali?


Naturalmente anche un non-temporanea potrebbe andare fuori portata, e quindi rompere il mio comportamento di classe, ma credo che vietando riferimenti temporanei eviterò maggior parte degli errori.

+0

Perché pensi di evitare la maggior parte degli errori come questo? –

+0

Bene, l'oggetto di cui ho bisogno di passare il riferimento non richiede di essere usato dopo l'istanza (cioè: ho appena istanziato l'oggetto e lo ho passato, quindi a causa del mio stile di codice non lo istanziavo nello stack). Se dimentico che il costruttore di altre classi ha bisogno di un valore _permanent_, vedendo il respinto temporaneo (cioè errore di tempo compilato) che si ricorderà di me, spero. – peoro

risposta

18

Se avete intenzione di memorizzare un riferimento e la necessità di utilizzarlo dopo il costruttore ha completato, è probabilmente meglio per il costruttore di prendere un puntatore:

struct C { 
    C(const X* p) : p_(p) { } 

    const X* p_; 
}; 

In questo modo, è praticamente garantito che non avrà un puntatore ad un temporaneo (a meno che lo X non faccia qualcosa di veramente stupido, come l'overloading degli unari & per restituire this).

Se il costruttore utilizza un puntatore, è anche più chiaro per gli utenti della classe che devono prestare attenzione alla durata dell'oggetto X passato al costruttore.

+4

Soluzione pulita e intelligente! –

+1

Sì, sono d'accordo, soluzione pulita e intelligente! Assumerò anche che 'p' non è nullo e lo memorizzerà come riferimento. – peoro

+0

D'accordo, OP dovrebbe imparare che i puntatori sono migliori! Utilizzare i riferimenti solo quando è assolutamente necessario (ad esempio nei costruttori di copie). – Yttrill