我想知道在下面的代码中,编译器如何从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/

10-11 23:20