logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.8.2.2 Ссылки

В описании T D, в котором D имеет вид

& список-спецификаций-cv opt D1

тип описываемого идентификатора есть

"...список-спецификаций-cv ссылка на T". Тип void& недопустим.

Например, во фрагменте

void f(double& a) { a += 3.14; }

// ...

double d = 0;

f(d);

a описывается как параметр, являющийся ссылкой, поэтому вызов

f(d) приведет к увеличению d на 3.14. Во фрагменте

int v[20];

// ...

int& g(int i) { return v[i]; }

// ...

g(3) = 7;

описывается: функция g() возвращает ссылку на целое; поэтому

оператор g() = 7; присвоит 7 четвертому элементу массива v.

Рассмотрим следующий программный фрагмент:

struct link {

link* next;

};

link* first;

void h(link*& p) // `p' ссылка на указатель

{

p->next = first;

first = p;

p = 0;

}

void k()

{

link* q = new link;

h(q);

}

Здесь p описано как ссылка на указатель на link, поэтому вызов h(q)

не изменит значение q, равное 0, см. также $$R.8.4.3.

Недопустимы ссылки на ссылки, ссылки на битовые поля ($$R.9.6),

массивы ссылок и указатели на ссылки. Описание ссылки должно содержать

инициализатор ($$R.8.4.3), за исключением тех случаев, когда описание

содержит явную спецификацию extern ($$R.7.1.1), или является описанием

члена класса ($$R.9.2) при описании самого класса, или является

описанием параметра или возвращаемого типа ($$R.8.2.5),

см. также $$R.3.1.