簡體   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