[英]How does the compiler deduce array size when defined as a template parameter?
我想知道在下面的代碼中,編譯器arrsize
從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]);
}
所以我的問題是:
當我向函數傳遞對數組的引用時,編譯器如何自動arrsize
參數的值? (機制是什么?)
如果我正常傳遞數組,為什么編譯器不能做同樣的事情? (通常是指不使用參考符號)
作為形式參數的T arr[arrsize]
會衰減為T* arr
,其中arrsize
被完全忽略(確實是該參數的數組性質)。
int a[4]
和你寫bubblesort(a)
,那么編譯器使用的事實,類型a
為int[4]
推斷arrsize
為4.如果你嘗試做bubblesort(p)
當p
的類型為int*
,推導將失敗並且將導致編譯錯誤。 T arr[arrsize]
寫為參數而不是T (&arr)[arrsize]
,則編譯器將自動將聲明重寫為T* arr
。 由於在簽名中不再出現arrsize
,因此無法推論得出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.