Step 8 (S-3123)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/541/step/8

В качестве параметров в функции могут передаваться не только ссылки на "обычные" переменные, но и ссылки на массивы. Следующая функция принимает ссылку на массив из трех значений типа int:


void foo(int (&a)[3]) { /* ... */ }


Обратите внимание, что скобки вокруг параметра a в данной конструкции обязательны — ведь мы хотим передать ссылку на массив, а не массив ссылок.

Кажется, что такая конструкция не имеет особого смысла, ведь массивы при передаче в функцию не копируются. Однако, такая конструкция запрещает компилятору игнорировать размер массива. 

Например, следующий код не будет компилироваться:


int a[1] = {};foo(a);


Компилятор g++ на это выдаст следующую ошибку:


error: invalid initialization of reference of type ‘int (&)[3]’ from expression of type ‘int [1]’


Т. е. компилятор не может преобразовать ссылку на массив из одного элемента в ссылку на массив из трех элементов (что и ожидалось).