Здравствуйте, pofig, Вы писали:
P>Салют.
P>Объясните плиз как следует понимать конструкцию
P>P>T (&array)[length]
P>
P>Для чего она нужна понятно, а вот что физически происходит и почему нужно писать именно так
P>не ясно. Для чего обязательно амперсанд и скобочки?
Амперсанд -- чтобы была ссылка на массив, а скобки -- из-за синтаксиса.
Ссылка нужна потому, что получить массив в качестве параметра нельзя; в C поэтому получали указатель на первый элемент:
void f( int * array );
int main() {
int a[3];
f(a);
}
Здесь при вызове f() происходит "сведение" (decaying) массива к указателю на первый элемент. Очевидно, что информация о размере потеряна.
Зато можно получить указатель на массив нужного размера, например:
void g( int (*array)[3] );
int main() {
int a[3];
g(&a);
}
Сведение здесь не происходит, т.к. передаётся уже указатель на массив.
Зачем здесь скобки -- см. пример ниже:
int* array_of_three_pointers_to_int [ 3 ];
int (*pointer_to_array_of_three_ints) [ 3 ];
Сейчас функция g работает только для массивов из трёх элементов. Обобщаем для любого размера:
template<size_t length>
void h( int (*array)[length] );
int main() {
int a[3];
h(&a);
}
Теперь для вызова шаблонной функции h нужно вывести параметры этого шаблона, за что отвечает вывод типов аргументов (argument type deduction); невероятно умный C++ понимает, что в данном примере length=3.
Ну а так как в C++ есть ссылки и в данном случае они просто удобнее, то можно заменить указатель на ссылку:
template<size_t length>
void hh( int (&array)[length] );
int main() {
int a[3];
hh(a);
}