2016-06-21 43 views
0

我想知道如何在下面的代码片段中编译器从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. 为什么编译器不能做同样的事情,如果我正常传递数组? (由通常我的意思是不使用参考符号)

+0

'型ARR [arrsize]'来自C: -/ – Jarod42

回答

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

和2是因为C. – juanchopanza

+0

准确地说,是因为老C.我觉得C11现在有VLA的类似的机制,不过这无关紧要到C++ 11。这两种语言在过去的20年中有所分歧。 – MSalters

2

T arr[arrsize]作为正式参数衰减到刚刚T* arr,其中arrsize完全被忽略(因为实际上是一个参数的数组性质)。

相关问题