Inicjowanie odwołań
Zmienne typu referencyjnego muszą być zainicjowane z obiektem typu, który dziedziczy ten typ referencyjny, lub obiektu typu, który może zostać przekonwertowany na typ, z którego dziedziczy typ referencyjny.Na przykład:
// 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
}
Jedynym sposobem, aby zainicjować odwołanie tymczasowego obiektu, jest zainicjowanie stałej tymczasowej obiektu.Po zainicjowaniu, zmienna typu odwołania zawsze wskazuje ten sam obiekt; nie można zmodyfikować odwołania do innego obiektu.
Mimo że składnia może być taka sama, inicjowanie zmiennych typu odwołania i przypisanie do zmiennych typu odwołania są semantycznie różne.W poprzednim przykładzie, przydziały, które zmieniają iVar i lVar wyglądają podobnie do inicjalizacji, ale mają różne efekty.Inicjowanie określa obiekt, na które wskazuje zmienna typu odwołania; przypisanie przypisuje do określonego obiektu poprzez odniesienie.
Ponieważ, zarówno przekazywanie argumentu typu odwołania do funkcji i zwracanie wartości typu odwołania przez funkcję są inicjacjami, formalne argumenty do funkcji są zainicjowane poprawnie podczas zwracania odwołania.
Zmienna typu odwołania może być deklarowana bez inicjatorów, tylko w następujących przypadkach:
Deklaracja funkcji (prototypy).Na przykład:
int func( int& );
Deklaracja typu funkcji zwracanej.Na przykład:
int& func( int& );
Deklaracja elementu członkowskiego klasy typu odwołania.Na przykład:
class c { public: int& i; };
Jawna deklaracja zmiennej określonej, jako extern.Na przykład:
extern int& iVal;
Podczas inicjowania zmiennej typu odwołania, kompilator używa wykresu decyzji pokazanego na poniższym rysunku, aby wybrać między utworzeniem odwołania do obiektu a tymczasowym obiektem, który wskazuje odwołanie.
Wykres decyzji dla inicjowania typów referencyjnych
Odwołania do typów volatile (zadeklarowane, jako volatile typename**&** identifier) mogą być zainicjowane z obiektami volatile tego samego typu lub z obiektami, które nie zostały zadeklarowane jako volatile.Nie mogą one jednak być zainicjowane z obiektami const tego typu.Podobnie, odwołania do typów const (zadeklarowanych jako const typename**&** identyfikator), mogą być zainicjowane z obiektami const tego samego typu (lub cokolwiek, co ma konwersje typu lub z obiektami, które nie zostały zadeklarowane jako const).Nie mogą one jednak być zainicjowane z obiektami volatile tego typu.
Odwołania, które nie są kwalifikowane słowem kluczowym const lub volatile mogą być zainicjowane tylko z obiektami nie zadeklarowanymi, jako const i volatile.