我有这个代码
template<int N, bool C = true>
struct A;
template<int N>
struct A<N, !(N % 5)> {
/* ... */
};
// should work
A<25> a;
也就是说,对于数字N
可以被整除5
,编译器应该使用部分特化。但编译器不会接受这种部分特化,因为标准要求它拒绝这样的代码,其中部分特化的非类型参数引用一个参数,而不仅仅是一个参数(例如,A<N, N>
将是有效的)。但这样做的原因是什么呢?
请注意,我可以简单地将代码更改为更冗长的示例,它是有效的
template<bool> struct wrap;
template<int N, typename = wrap<true> >
struct A;
template<int N>
struct A<N, wrap<!(N % 5)> > {
/* ... */
};
// should work
A<25> a;
这很好,因为它不再是非类型参数。但是规范禁止更直接的部分专业化的原因是什么?
我认为其中很多都是历史性的。最初根本不允许使用非类型模板参数。当它们被添加时,有lots的限制。当人们尝试不同的可能性并确认它们不会造成问题时,一些限制就被消除了。
其中一些最初的限制没有任何特殊原因仍然存在,除了没有人费心去改变它们这一事实之外。就像那里一样,其中许多都可以解决,因此删除它们通常不会造成任何特别的困难。主要归结为一个问题:是否有人足够关心这个特殊案例并就此写一篇论文。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)