【问题标题】:C++ template parameter and partial specialization : strong or weak typing?C++ 模板参数和部分特化:强类型还是弱类型?
【发布时间】:2016-03-10 15:21:56
【问题描述】:

今天,我和我的一个朋友因一个愚蠢的错误而苦苦挣扎,这让我想知道模板参数在 C++ 中是如何工作的。考虑以下代码,我尝试部分专门化一个类attr<MyClass<I>>,其中Iunsigned 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++的弱吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    如果P有一个包含&lt;i&gt;的形式,并且A对应值的类型与i的类型不同,则推演失败。如果P的形式包含[i],并且i的类型不是整数类型,则推演失败。

    他们的测试套件中的测试用例仅针对功能进行测试,它们似乎会发出合理的错误消息: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

    “知道哪些名称是类型名称可以检查每个模板的语法。程序格式错误,不需要诊断,如果:

    • 无法为模板生成有效的特化并且该模板未实例化,或者..."

    没有合法的方式来触发该模板的实例化,因此您可以争辩说不能为它生成有效的特化。在这种解释下,行为是不确定的,任何事情都是合法的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      相关资源
      最近更新 更多