9

这个问题是关于采用静态已知大小的数组的函数。

以下面的最小程序为例:

#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)推断5could 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 调用函数......

4

2 回答 2

15

编译器会默默地更改函数参数的类型,int a[N]从而int *a丢失数组的大小。int(&a)[5]确实是对大小为 5 的数组的引用,并且不能传递任何其他大小的数组。

于 2012-05-08T19:37:17.133 回答
1

我认为这是引用和指针之间的区别。

arrfun_a 传递一个指向 int 的指针。

arrfun_b 传递对整数数组的引用。

于 2012-05-08T19:39:49.277 回答