在这个问题中,我将参考我之前的问题.
在该问题中,我发现以下内容无效:
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> { };
事实上,它似乎有效,所以感谢提出它的人。
无论如何,我不明白的是为什么这是有效的代码而前一个不是。
它是否应该遭受与先前解决方案相同的模糊性?在这种情况下,编译器为什么以及如何解决这种歧义?
根据上一个问题(请参阅本问题开头的链接),在我看来,可变参数部分仍然应该将所有参数吸收到最后,因此该代码也不应该有效。
当然,我错了,但是我的推理究竟出了什么问题呢?
在类模板中,预期模板参数列表C<a,b,c,d,e,f>
需要匹配
template<typename T, typename... A, typename S>
其中...A 只是浮动在参数列表中。
但在特化中,需要匹配的不是模板变量的列表,而是模式:
C<T(A...), S>
这很容易,因为A...
被定界。
因此,在模板专业化中,参数列表只是符号、一些标量和一些参数包的清单,它们将以模式的形式出现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)