我想知道在下面的代码中,编译器如何从arrsize
函数参数推导出T (&arr)[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
参数的值? (机制是什么?)如果我正常传递数组,为什么编译器不能做同样的事情? (通常是指不使用参考符号)
最佳答案
它可以推断出大小,因为在调用时在编译时就知道大小。如果您具有int a[4]
,并且编写了bubblesort(a)
,则编译器将使用a
类型为int[4]
的事实来推论arrsize
为4。如果尝试在bubblesort(p)
时执行p
>的类型为int*
,推导将失败并且将导致编译错误。
如果将T arr[arrsize]
作为参数而不是T (&arr)[arrsize]
编写,则编译器将自动将声明重写为T* arr
。由于arrsize
不再出现在签名中,因此无法推论。
关于c++ - 当定义为模板参数时,编译器如何推断数组大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37952603/