簡體   English   中英

為什么在零數組的情況下編譯器不推導template參數?

[英]Why a compiler doesn't deduce the template parameter in case of zero array?

我已閱讀以下鏈接,了解如何通過模板函數計算數組的大小:

錯誤:沒有匹配的函數調用'size_of_array(int [0])'
std :: size_t num = size_of_array(arr);

#include <cstddef>
template <typename T, std::size_t N>
inline std::size_t size_of_array( T (&)[N] ) {
   return N;
}
int main()
{
  int arr[0]={};
  std::size_t num = size_of_array(arr);
}

根據標准草案n4296中的§8.3.4數組:

在聲明TD中,D具有以下形式

D1 [常量表達式]屬性說明符序列

聲明T D1中的標識符的類型為“派生聲明者類型列表T”,則D的標識符的類型為數組類型;

...

如果存在常數表達式,則該常數表達式應為std :: size_t類型的轉換常數表達式,其值應大於零。

因此您的代碼無效。

根據[temp.deduct / 8]( 工作草案模板論證推導 ,重點說明):

類型推導可能由於以下原因而失敗:
[...]
-嘗試創建一個元素類型為void,函數類型,引用類型或抽象類類型的數組 ,或者嘗試創建大小為零或負數的數組

零長度數組的類型推導可能會失敗(主要是因為也不允許零長度數組),這就是為什么會出現錯誤的原因。
另請注意,在同一段中,我們有以下內容(強調我的意思)

如果使用替換的參數編寫,則無效的類型或表達式將是格式錯誤的, 並且需要診斷

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM