|
|
В описании 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.
| |