Re: интерпретация T (&array)[size] в шаблонах
От: Kirikaza Россия kirikaza.ru
Дата: 21.12.11 19:27
Оценка: 24 (1) +1
Здравствуйте, 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.