Inicializando referências
Variáveis do tipo de referência devem ser inicializadas com um objeto do tipo do qual o tipo de referência é derivado, ou com um objeto de um tipo que possa ser convertido para o tipo do qual o tipo de referência é derivado. Por exemplo:
// 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
}
A única maneira de inicializar uma referência com um objeto temporário é inicializar um objeto temporário constante. Após a inicialização, uma variável de tipo de referência sempre aponta para o mesmo objeto; ela não pode ser modificada para apontar para outro.
Embora a sintaxe possa ser a mesma, a inicialização das variáveis do tipo de referência e atribuição para as variáveis do tipo de referência são semanticamente diferentes. No exemplo anterior, as atribuições que modificam iVar e lVar são semelhantes às inicializações, mas têm efeitos diferentes. A inicialização especifica o objeto para o qual os pontos das variáveis do tipo de referência apontam; a atribuição atribui o objeto mencionado pela referência.
Como passam um argumento do tipo de referência para uma função e retornam um valor do tipo de referência de uma função que são inicializações, os argumentos formais para uma função são inicializados corretamente e as referências são retornadas.
As variáveis do tipo de referência podem ser declaradas sem inicializadores, apenas na seguinte maneira:
Declarações de função (protótipos). Por exemplo:
int func( int& );
Declarações de tipo de retorno de função. Por exemplo:
int& func( int& );
Declaração de um membro da classe do tipo referência. Por exemplo:
class c { public: int& i; };
Declaração de uma variável especificada explicitamente como extern. Por exemplo:
extern int& iVal;
Ao inicializar uma variável do tipo de referência, o compilador usa o gráfico de decisão mostrado na figura a seguir para selecionar entre a criação de uma referência para um objeto ou a criação de um objeto temporário para o qual a referência aponta.
Gráfico de decisão para a inicialização de tipos de referência
As referências aos tipos volatile (declaradas como volatile um identificador**&** typename) podem ser inicializadas com objetos volatile do mesmo tipo ou com objetos que não foram declarados como volatile. No entanto, eles não podem ser inicializados com objetos const desse tipo. De maneira semelhante, as referências aos tipos const (declaradas como identificador const**&** typename) podem ser inicializadas com objetos const do mesmo tipo (ou qualquer coisa que tenha uma conversão para o tipo ou com objetos que não foram declarados como const). No entanto, eles não podem ser inicializados com objetos volatile desse tipo.
As referências não qualificadas com a palavra-chave const ou volatile podem ser iniciadas apenas com os objetos não declarados como const ou volatile.