使用 C 模板知道 C 樣式陣列的長度,我們需要這個:
#include<stdio.h>
template<class T,size_t N>
size_t length(T (&a)[N]){ return N; }
int main() {
int fd[2];
printf("%lld\n", length(fd));;
return 0;
}
它作業,列印2。我的問題是關于語法。
在 的宣告中length,為什么引數應該像(&a)[N],并且a[N]不起作用?
如果我改為
template<class T,size_t N>
size_t length(T a[N]){ return N; }
gcc 會說:
template argument deduction/substitution failed:
couldn't deduce template parameter 'N'
為什么在這里需要一個額外的&和一對圍繞陣列識別符號的大括號,這背后的模板規則/語法規則是什么?
欣賞詳細的解釋。
uj5u.com熱心網友回復:
在這個函式宣告中
template<class T,size_t N>
size_t length(T a[N]){ return N; }
編譯器將具有陣列型別的引數調整為指向陣列元素型別的指標。
那就是這個宣告實際上相當于
template<class T,size_t N>
size_t length(T *a){ return N; }
另一方面,在此呼叫中用作引數運算式的陣列
length(fd)
隱式轉換為指向其第一個元素的指標。
所以編譯器無法推匯出模板非型別引數 N 的值。
當引數被宣告為參考時,則不會發生上述調整和隱式轉換。參考用作陣列的別名。
請注意,要使用size_tC 函式輸出無符號整數型別的物件,printf您需要使用轉換說明符zu而不是lld.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496352.html
