Здравствуйте, pofig, Вы писали:
P>Салют.
P>Объясните плиз как следует понимать конструкцию
P>P>T (&array)[length]
P>
P> используемую в шаблонах:
P>P>template<typename T, int length>
P>void function(T (&array)[length]) {}
P>
P>Для чего она нужна понятно, а вот что физически происходит и почему нужно писать именно так
P>не ясно. Для чего обязательно амперсанд и скобочки?
Таким образом задается ссылка на массив. В данном случае
& — это спецификатор ссылки. В С++ массив в функции можно передавать двумя способами. Если в функции параметр объявлен как массив, например,
void f( int a[] ), то при передаче массива имя массива преобразуется в указатель на первый элемент массива. А если вы объявили ссылку на массив в качестве параметра
void f( int ( &a )[10] ); то в функцию передасться ссылка на массив. То есть внутри функции вы получите алиас вашего исходного массива, который был задан в качестве аргумента при вызове функции. При этом вся информации о массиве будет сохранена.
Сравните два выражения, которые, допустим, присутствуют в теле указанных функция:
первая функция sizeof( a );
вторая функция sizeof( a );
Длля первой функции резальтат работы оператора будет равен 4 (на 32 битовой платформе) , то есть размеру указателя, так как в первой функции массив, заданный в качестве аргумента функции преобразуется в указатель на первый элемент массива.
Во второй функции результат работы оператора будет равен 40, так как во второй функции вы имеете дело с самим исходным массивов, заданным алиасом, указанным в качестве имени параметра.