繁体   English   中英

当定义为模板参数时,编译器如何推断数组大小?

[英]How does the compiler deduce array size when defined as a template parameter?

我想知道在下面的代码中,编译器arrsizeT (&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]);
}

所以我的问题是:

  1. 当我向函数传递对数组的引用时,编译器如何自动arrsize参数的值? (机制是什么?)

  2. 如果我正常传递数组,为什么编译器不能做同样的事情? (通常是指不使用参考符号)

作为形式参数的T arr[arrsize]会衰减为T* arr ,其中arrsize被完全忽略(确实是该参数的数组性质)。

  1. 它可以推断出大小,因为在调用时在编译时就知道大小。 如果你有int a[4]和你写bubblesort(a) ,那么编译器使用的事实,类型aint[4]推断arrsize为4.如果你尝试做bubblesort(p)p的类型为int* ,推导将失败并且将导致编译错误。
  2. 如果将T arr[arrsize]写为参数而不是T (&arr)[arrsize] ,则编译器将自动将声明重写为T* arr 由于在签名中不再出现arrsize ,因此无法推论得出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM