[英]C++ template parameter and partial specialization : strong or weak typing?
今天,我和我的一個朋友在一個愚蠢的錯誤上掙扎了很多,我讓我想知道模板參數在 C++ 中是如何工作的。 考慮以下代碼,我嘗試部分特化一個類attr<MyClass<I>>
,其中I
是一個unsigned int
,盡管MyClass
需要一個int
參數:
#include <iostream>
template<int I>
class MyClass
{
};
template<typename T>
struct attr;
template<unsigned int I>
struct attr<MyClass<I>>
{
};
int main(int argc, char *argv[])
{
attr<MyClass<1>> att;
return 0;
}
g++
失敗並顯示錯誤消息
main.cpp: In function ‘int main(int, char**)’:
main.cpp:20:22: erreur : aggregate ‘attr<MyClass<1> > att’ has incomplete type and cannot be defined
attr<MyClass<1>> att;
然后clang
編譯它(由於att
未使用,因此只是一個警告)。
所以我想知道:
規范中是否有任何內容會支持其中一個?
我們可以說clang
模板參數的類型比g++
的弱嗎?
是的,至少根據現行標准,GCC 拒絕是正確的。 也許 Clang 人在這里實現了一些缺陷報告,我不知道。
http://eel.is/c++draft/temp.deduct.type#17
如果 P 的形式包含
<i>
,並且 A 的對應值的類型與 i 的類型不同,則推導失敗。 如果 P 的形式包含[i]
,並且 i 的類型不是整數類型,則推導失敗。
他們在測試套件中的測試用例僅針對函數進行測試,對於這些函數,它們似乎會發出合理的錯誤消息: https : //github.com/llvm-mirror/clang/blob/master/test/CXX/temp/temp.fct。規格/temp.deduct/temp.deduct.type/p17.cpp 。
此外,由於永遠無法推導出部分專業化,我們還會遇到http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#549 ,詢問是否應該拒絕此類構造前期。 在我看來,如果您願意,可以應用http://eel.is/c++draft/temp.res#8 :
“知道哪些名稱是類型名稱可以檢查每個模板的語法。程序格式錯誤,無需診斷,如果:
- 無法為模板生成有效的專業化並且該模板未實例化,或者......”
沒有合法的方法來觸發該模板的實例化,因此您可能會爭辯說無法為其生成有效的特化。 在這種解釋下,行為是未定義的,任何事情都是合法的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.