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

标签 c++ arrays templates reference template-argument-deduction

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

所以我的问题是:

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

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

最佳答案

  1. 它可以推导出大小,因为大小在编译时调用上下文中是已知的。如果您有 int a[4],并且您编写了 bubblesort(a),那么编译器会使用 a 的类型这一事实int[4]arrsize 推导为 4。如果您尝试在 p 具有时执行 bubblesort(p)输入int*,推导会失败,会导致编译错误。
  2. 如果你写T arr[arrsize]作为参数而不是T (&arr)[arrsize],那么编译器会自动重写声明为 T* 到达。由于 arrsize 不再出现在签名中,因此无法推断。

关于c++ - 当定义为模板参数时,编译器如何推断数组大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37952603/

相关文章:

c++ - 如何使用 C++ 程序查找连接到 Ubuntu 操作系统的硬件

c++ - "The C++ compiler "/usr/bin/c++ "is not able to compile a simple test program."尝试安装 OpenCV 时

c++ - 为何模板参数不参与类的定义/重新定义

Python - 切片数组直到满足特定条件

javascript - 过滤字符串数组

javascript - 以可优化的方式使用 requirejs 加载模板

c++ - 关于移动/复制 C++ 对象实例

c++ - 调用构造函数并初始化

c++ - 如何在 C++ 中比较两个泛型类型?

qt - QPixmap.loadFromData() 不从 QByteArray 加载图像