![](/img/trans.png)
[英]Why can't GCC compiler deduce one of the template parameter from std::array in alias template form
[英]Why a compiler doesn't deduce the template parameter in case of zero array?
我已閱讀以下鏈接,了解如何通過模板函數計算數組的大小:
但是這個技巧在零數組的情況下不起作用。 為什么以下代碼不正確? 例如,在線編譯器ideone打印以下錯誤消息:
錯誤:沒有匹配的函數調用'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.