この質問は、静的に既知のサイズの配列を受け取る関数に関するものです。
たとえば、次の最小限のプログラムを考えてみましょう。
#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
。
これまでのところ、私が見つけた唯一の違いは、テンプレート引数の推論が機能するかどうか、および5ではないNで関数を呼び出すことが可能かどうかです...