C ++模板参数和部分特化:强或弱类型?

时间:2016-03-10 15:21:57

标签: c++ templates c++14 typing

今天,我的一个朋友和我在一个愚蠢的错误中苦苦挣扎,我让我想知道模板参数在C ++中是如何工作的。考虑以下代码,我尝试部分专门化attr<MyClass<I>> I unsigned intMyClassint期望#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++模板参数的输入弱于$http data吗?

1 个答案:

答案 0 :(得分:1)

是的,GCC拒绝是正确的,至少根据现行标准。也许Clang人在这里实施了一些缺陷报告,我不知道。

http://eel.is/c++draft/temp.deduct.type#17

  

如果P的表格包含<i>,并且如果A的相应值的类型与i的类型不同,则扣除失败。如果P的表单包含[i],并且如果i的类型不是整数类型,则扣除失败。

他们的testuite中的测试用例仅针对函数进行测试,它们似乎发出了合理的错误消息:https://github.com/llvm-mirror/clang/blob/master/test/CXX/temp/temp.fct.spec/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

  

&#34;知道哪些名称是类型名称允许检查每个模板的语法。该程序格式错误,无需诊断,如果:

     
      
  • 无法为模板生成有效的专业化,并且该模板未实例化,或者......&#34;
  •   

没有合法的方法可以触发该模板的实例化,因此您可能会认为无法为其生成有效的专业化。根据这种解释,行为是不明确的,任何事情都是合法的。