Inicializar referencias
Las variables de tipo de referencia se deben inicializar con un objeto del tipo del que se deriva el tipo de referencia o con un objeto de un tipo que se pueda convertir al tipo que se deriva del tipo de referencia. Por ejemplo:
// 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
}
La única manera de inicializar una referencia con un objeto temporal consiste en inicializar un objeto temporal constante. Una vez inicializado, una variable de tipo de referencia siempre señala al mismo objeto; no se puede modificar para que señale a otro objeto.
Aunque la sintaxis puede ser igual, la inicialización de variables de tipo de referencia y la asignación a variables de tipo de referencia son semánticamente diferentes. En el ejemplo anterior, las asignaciones que modifican iVar y lVar son similares a las inicializaciones, pero tienen efectos diferentes. La inicialización especifica el objeto al que señala la variable de tipo de referencia; la asignación asigna al objeto al que se hace referencia a través de la referencia.
Dado que tanto pasar un argumento de tipo de referencia a una función como devolver un valor de tipo de referencia desde una función son inicializaciones, los argumentos formales a una función se inicializan correctamente, así como las referencias devueltas.
Las variables de tipo de referencia solo se pueden declarar sin inicializadores en lo siguiente:
Declaraciones de función (prototipos). Por ejemplo:
int func( int& );
Declaraciones de tipo de valor devuelto de función. Por ejemplo:
int& func( int& );
Declaración de un miembro de clase de tipo de referencia. Por ejemplo:
class c { public: int& i; };
Declaración de una variable especificada explícitamente como extern. Por ejemplo:
extern int& iVal;
Al inicializar una variable de tipo de referencia, el compilador usa el gráfico de decisión que se muestra en la figura siguiente para elegir entre crear una referencia a un objeto o crear un objeto temporal al que señala la referencia.
Gráfico de decisión de inicialización de tipos de referencia
Las referencias a tipos volatile (declarados como volatile typename**&** identifier) se pueden inicializar con objetos volatile del mismo tipo o con objetos que no se hayan declarado como volatile. No pueden, sin embargo, inicializarse con objetos const de ese tipo. De igual forma, las referencias a tipos const (declarados como const nombredetipo**&** identificador) se pueden inicializar con objetos const del mismo tipo (o con algo que tenga una conversión a ese tipo o con objetos que no se hayan declarado como const). No pueden, sin embargo, inicializarse con objetos volatile de ese tipo.
Las referencias que no se califican con const o la palabra clave volatile solo se pueden inicializar con objetos que no se hayan declarados como const ni volatile.