类模板部分专用化的参数列表的限制中是否存在GCC 4.9.1(5.1)错误

Is there a GCC 4.9.1 (5.1) bug in the restrictions for the argument list of a class template partial specialization?

本文关键字:GCC 存在 错误 是否 专用 板部 参数 列表      更新时间:2023-10-16

我的GCC 4.9.1没有给出错误:

#include <iostream>
template<typename _Tp, typename... _Args>
  struct IsCble { };
template<typename _Tp>
  struct IsCble<_Tp> { static constexpr int value {4}; };
int main()
{
    std::cout << IsCble<int>::value << std::endl;
    return 0;
}

与 GCC 5.1 相同。但他们应该根据:

[温度.class规格] 14.5.5\8.4

— 专业化应比初级专业化 模板。

我认为,在上面的代码中,部分专用化并不比主模板更专业,因为:

[温度扣除类型] 14.8.2.5\9.1

— 如果 P 不包含对应于 A i 然后 Ai 被忽略;

因此,他们似乎忽略了 14.5.5\8.4 并通过以下方式解决了歧义:

[temp.class.spec.match] 14.5.5.1\1

这是通过匹配类模板的模板参数来完成的 专用于部分的模板参数列表 专业化

它是符合标准的实现 (1.4\8)吗?

略的参数应该比空参数包更专业。不同上下文中的同一问题是未决问题的主题:

CWG同意应该接受该示例,并将此案例作为后期决胜局处理,更喜欢省略的参数而不是参数包。

因此,基于标准的当前文本,您是对的,但是当这些规则预计会发生变化时,调整编译器以遵循当前规则几乎没有意义。