Поделиться через


Инициализация ссылок

Переменные ссылочного типа должны инициализироваться объектом типа, на котором основан ссылочный тип, или объектом типа, который можно преобразовать в такой тип. Например:

// 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.

См. также

Ссылки

Инициализаторы