如果你企圖試用類似如下函數計算數組長度:
//數組退化為指針,這里算不出正確的數組長度 int get_array_length0(int a[])//這里等同於int* { return sizeof(a)/sizeof(int); }
這里sizeof(a)是返回int*指針大小,因為數組在參數傳遞的時候為地址傳遞,實際上調用這個函數int[]退化為了int*指針。
看看Xcode下的warning:
所以,我們需要數組在參數傳遞的時候需要使用數組引用,int (&a)[],這個聲明類型不完備(incomplete type)
這樣做的話,如果你再對a進行sizeof,則會有一個編譯錯誤:
invalid application of 'sizeof' to an incomplete type int[] .這里sizeof計算一個數組大小,需要它的類型信息是完備的,即包含數組大小。
所以你僅可在數組定義處使用sizeof,因為定義處數組的類型信息是完備的。
並且你也沒有辦法調用這個函數,因為類型不完備,所以類型是和數組int a[5]匹配不上的。
於是最終,我們需要函數模板來解決這個問題。簡單來說就是 引用
//類型參數+非類型參數+數組引用 //非類型模板參數 綁定實參必須是常量表達式 template <typename T,unsigned N> int get_array_length(T (&array)[N]) { return sizeof(array)/sizeof(T); } //或者直接聲明為類型引用 T=Type (&)[N] template<typename T> int get_array_length2(T& array) { return sizeof(array)/sizeof(array[0]); } int main() { int a[5]={1,2,3,4,5}; cout<<get_array_length(a)<<endl; cout<<get_array_length2(a)<<endl; return 0; }