我知道可以使用
确定C风格数组(在堆栈上分配)的大小template <typename T, size_t N>
size_t arr_size(T(&)[N])
{
return N;
}
这很好用。现在我的问题是为什么我们必须通过引用传递数组?如果我们按值传递,
template <typename T, size_t N>
size_t arr_size(T[N])
{
return N;
}
代码无法编译,即在
中#include <iostream>
template <typename T, size_t N>
size_t arr_size(T[N])
{
return N;
}
int main()
{
int arr[10];
std::cout << "Array has size: " << arr_size(arr) << std::endl;
}
我们得到了
error: no matching function for call to 'arr_size'
std::cout << "Array has size: " << arr_size(arr) << std::endl;
^~~~~~~~
/Users/vlad/minimal.cpp:6:8: note: candidate template ignored: couldn't infer template argument 'N'
size_t arr_size(T[N])
如果我们定义
template <typename T, size_t N>
size_t arr_size(T(&)[N])
然后它有效。