簡體   English   中英

C++ 模板參數和部分特化:強類型還是弱類型?

[英]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.

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