代码之家  ›  专栏  ›  技术社区  ›  skypjack

变量模板、参数包及其在参数列表中讨论的模糊性

  •  11
  • skypjack  · 技术社区  · 10 年前

    在这个问题中,我将参考 my previous question .

    在这个问题中,我发现以下内容是无效的:

    template<typename T, typename... A, typename S>
    class C { };
    

    这是因为:

    对于类模板,[这是无效的代码],因为必须始终指定它们的参数,除非参数包在末尾,并将所有剩余的模板参数吞掉,否则这将始终导致歧义。

    当然,这很有道理,我明白了。

    然后,作为一种替代方法,提出了以下涉及专业化的方法:

    template<typename F, typename S>
    class C;
    
    template<typename T, typename... A, typename S>
    class C<T(A...), S> { };
    

    事实上,它似乎有效,所以多亏了提出它的人。

    无论如何,我不明白的是,为什么这是有效的代码,而上一个不是。
    它是否应该受到先前解决方案的同样模糊的影响?在这种情况下,编译器为什么以及如何解决这种歧义?
    根据上一个问题(请参见本问题开头的链接),在我看来,变量部分仍然应该将所有参数都吸到最后,因此此代码也不应该有效。
    当然,我错了,但我的推理到底有什么错?

    1 回复  |  直到 9 年前
        1
  •  7
  •   rici    10 年前

    在类模板中,一个预期的模板参数列表 C<a,b,c,d,e,f> 需要匹配

    template<typename T, typename... A, typename S>
    

    其中…A只是在参数列表中浮动。

    但在专业化中,需要匹配的不是模板变量列表,而是模式:

    C<T(A...), S>
    

    这很容易,因为 A... 被分隔。

    因此,在模板专用化中,参数列表只是一个符号清单,一些标量和一些参数包,它们将以模式出现。