繁体   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