[英]How does the compiler deduce array size when defined as a template parameter?
我想知道在下面的代码中,编译器arrsize
从T (&arr)[arrsize]
函数参数推导出arrsize
模板参数。 例如,当我向其传递4个元素的数组时,在函数调用中未提及数字4时,它正确地将arrsize
参数确定为4。但是,如果我正常传递该数组(而不是作为对数组的引用)数组),也就是说,如果将T (&arr)[arrsize]
更改为T arr[arrsize]
,则需要我在模板参数列表中显式提供arrsize
参数。
template <class T, int arrsize> void bubblesort(T (&arr)[arrsize], int order=1)
{
if (order==0) return;
bool ascending = (order>0);
int i,j;
for (i=arrsize; i>0; i--)
for (j=0; j<i-1; j++)
if (ascending?(arr[j]>arr[j+1]):(arr[j]<arr[j+1])) swap(arr[j],arr[j+1]);
}
所以我的问题是:
当我向函数传递对数组的引用时,编译器如何自动arrsize
参数的值? (机制是什么?)
如果我正常传递数组,为什么编译器不能做同样的事情? (通常是指不使用参考符号)
作为形式参数的T arr[arrsize]
会衰减为T* arr
,其中arrsize
被完全忽略(确实是该参数的数组性质)。
int a[4]
和你写bubblesort(a)
,那么编译器使用的事实,类型a
为int[4]
推断arrsize
为4.如果你尝试做bubblesort(p)
当p
的类型为int*
,推导将失败并且将导致编译错误。 T arr[arrsize]
写为参数而不是T (&arr)[arrsize]
,则编译器将自动将声明重写为T* arr
。 由于在签名中不再出现arrsize
,因此无法推论得出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.