Инициализация ссылок
Переменные ссылочного типа должны инициализироваться объектом типа, на котором основан ссылочный тип, или объектом типа, который можно преобразовать в такой тип. Например:
// 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
}
Единственный способ инициализировать ссылку с помощью временного объекта является инициализация постоянного временного объекта. После инициализации переменная ссылочного типа всегда указывает на один и тот же объект; ее невозможно изменить, чтобы она указывала на другой объект.
Хотя синтаксис может быть одинаковым, инициализация переменных ссылочного типа и присваивание значений переменным ссылочного типа семантически различаются. В предыдущем примере присваивания, которые изменяют значения переменных iVar и lVar, выглядят аналогично инициализации, но имеют другой эффект. Инициализация определяет объект, на который указывает переменная ссылочного типа; при присваивании через ссылку производится присваивание значения объекту, на который указывает ссылка.
Поскольку передача аргумента ссылочного типа в функцию и возврат значения ссылочного типа из функции являются инициализацией, формальные аргументы функции, а также возвращаемые ссылки инициализируются правильно.
Переменные ссылочного типа можно объявлять без инициализаторов только в указанных ниже случаях.
Объявления функций (прототипы). Например:
int func( int& );
Объявления типов, возвращаемых функцией. Например:
int& func( int& );
Объявления члена класса ссылочного типа. Например:
class c { public: int& i; };
Объявление переменной, явно указанной как extern. Например:
extern int& iVal;
При инициализации переменной ссылочного типа компилятор с помощью графа принятия решений, показанного на следующем рисунке, выбирает между созданием ссылки на объект и созданием временного объекта, на который указывает ссылка.
Граф принятия решений для инициализации ссылочных типов
Ссылки на типы volatile (объявленные как volatile имя_типа**&** идентификатор) можно инициализировать с помощью объектов volatile того же типа или с помощью объектов, которые не были объявлены как volatile. Однако их невозможно инициировать с помощью объектов const этого типа. Аналогично, ссылки на типы const (объявленные как const имя_типа**&** идентификатор) можно инициализировать с помощью объектов const того же типа (а также с помощью любых объектов, которые могут быть преобразованы в этот тип, или с помощью объектов, которые не были объявлены как const). Однако их невозможно инициировать с помощью объектов volatile этого типа.
Ссылки, для которых в качестве квалификатора не указано ни одно из ключевых слов const или volatile, можно инициализировать только с помощью объектов, которые не были объявлены ни как const, ни как volatile.