Inizializzazione di riferimenti
Variabili di tipo riferimento devono essere inizializzate con un oggetto del tipo da cui il tipo riferimento viene derivato o con un oggetto di un tipo che possa essere convertito nel tipo da cui il tipo riferimento viene derivato. Ad esempio:
// initializing_references.cpp
int iVar;
long lVar;
int main() {
long& LongRef1 = lVar; // No conversion required.
long& LongRef2 = iVar; // C2440
const long& LongRef3 = iVar; // OK
LongRef1 = 23L; // Change lVar through a reference.
LongRef2 = 11L; // Change iVar through a reference.
LongRef3 = 11L; // C3892
}
L'unico modo per inizializzare un riferimento a un oggetto temporaneo è inizializzare un oggetto temporaneo costante. Dopo l'inizializzazione, una variabile di tipo riferimento punta sempre allo stesso oggetto; non può essere modificata per puntare a un altro oggetto.
Sebbene la sintassi possa risultare analoga, l'inizializzazione di variabili di tipo riferimento e l'assegnazione alle variabili di tipo riferimento sono semanticamente diverse. Nell'esempio precedente, le assegnazioni che modificano iVar e lVar sono simili alle inizializzazioni, ma hanno effetti diversi. L'inizializzazione specifica l'oggetto a cui la variabile di tipo riferimento punta; l'assegnazione assegna all'oggetto di riferimento tramite il riferimento.
Poiché sia il passare un argomento di tipo riferimento a una funzione che la restituzione di un valore di tipo riferimento da una funzione sono inizializzazioni, gli argomenti formali di una funzione vengono inizializzati correttamente, così come i riferimenti restituiti.
Variabili di tipo riferimento possono essere dichiarate senza inizializzatori solo in quanto segue:
Dichiarazioni di funzione (prototipi). Ad esempio:
int func( int& );
Dichiarazioni del tipo restituito dalla funzione. Ad esempio:
int& func( int& );
Dichiarazione di un membro della classe di tipo riferimento. Ad esempio:
class c { public: int& i; };
Dichiarazione di una variabile esplicitamente specificata come extern. Ad esempio:
extern int& iVal;
Nell'inizializzare una variabile di tipo riferimento, il compilatore utilizza il grafico di decisione illustrato nella figura che segue per scegliere tra la creazione di un riferimento a un oggetto o la creazione di un oggetto temporaneo a cui il riferimento punta.
Grafico decisionale per l'inizializzazione dei tipi di riferimento
I riferimenti ai tipi volatile (dichiarati come volatile typename**&** identifier) possono essere inizializzati con gli oggetti volatile dello stesso tipo o con oggetti che non sono stati dichiarati volatile. Non possono, tuttavia, essere inizializzati con gli oggetti const di quel tipo. Analogamente, i riferimenti ai tipi const (dichiarati come const typename**&** identifier) possono essere inizializzati con oggetti const dello stesso tipo (o qualsiasi elemento che abbia una conversione di quel tipo o con oggetti che non sono stati dichiarati come const). Non possono, tuttavia, essere inizializzati con oggetti volatile di quel tipo.
I riferimenti che non sono qualificati con const o con la parola chiave volatile possono essere inizializzati solo con gli oggetti non dichiarati come const né volatile.