Разница между int a[5] и int (&a)[5] в выводе параметров шаблона

Этот вопрос касается функций, которые принимают массивы статически известного размера.

Возьмем, к примеру, следующую минимальную программу :

#include <iostream>

template<size_t N>
void arrfun_a(int a[N])
{
    for(size_t i = 0; i < N; ++i)
        std::cout << a[i]++ << " ";
}

int main()
{
    int a[] = { 1, 2, 3, 4, 5 };
    arrfun_a<5>(a);
    std::cout << std::endl;
    arrfun_a<5>(a);

    return 0;
}

, которая при запуске выводит ожидаемый результат:

2 3 4 5 6
3 4 5 6 7

Однако, когда я попытался заставить свой компилятор (VS 2010 )вывести 5, он could not deduce template argument for 'int [n]' from 'int [5]'.

Небольшое исследование привело к обновленному arrfun_b, где работает дедукция параметра шаблона.:

template<size_t n>
void arrfun_b(int (&a)[n])
{
    for(size_t i = 0; i < n; ++i)
        std::cout << ++(a[i]) << std::endl;
}

Результат программы один и тот же, вызывается ли arrfun_aили arrfun_b.

До сих пор единственное различие, которое я обнаружил, заключается в том, работает ли вывод шаблонного аргумента и можно ли вызвать функцию с N, отличным от 5...

9
задан Deduplicator 21 October 2018 в 23:15
поделиться