核心代碼
template <std::size_t N>
void f(char (&arr)[N]) {
std::cout << sizeof(arr) << '\n'; // 輸出數組總字節數,而非指針大小
}
原理解析
- 參數類型為
char (&)[N] —— 數組引用,保留數組長度信息;
- 調用時
N 自動推導為數組元素個數;
sizeof(arr) 返回完整數組大小(N * sizeof(char)),證明未退化為指針;
- 依據 C++11 標準 [dcl.fct] 8.3.5/5:數組引用參數不發生退化。
應用場景
- 需在函數內獲取數組長度的通用算法;
- 編譯期靜態斷言數組大小;
- 避免傳遞指針+長度的雙參數模式,減少錯誤。
注意事項
- 僅適用於定長數組,動態分配記憶體(
new T[n])無法使用;
- 模板會為每個不同長度實例化代碼,可能增加二進制體積;
- C++20 可用
std::span 替代,提供更靈活的非擁有視圖。
相關編譯錯誤 Q&A
- undefined reference to `main`
- 編譯生成可執行文件時缺少
main 函數。若僅編譯目標文件,去掉 -o 選項改用 -c。
- undefined reference to `ClassName::Function()`
- 成員函數聲明未定義,或定義未加入編譯單元。檢查:
const 成員函數不能修改數據;專案依賴關係正確;重新建立專案清理緩存。