C++ 为什么在可变模板中不能将后续模板参数指定为默认值?
这是不允许的真正的技术原因吗C++ 为什么在可变模板中不能将后续模板参数指定为默认值?,c++,templates,variadic-templates,C++,Templates,Variadic Templates,这是不允许的真正的技术原因吗 template< class... Ts, class = std::enable_if</*...*/> > struct S{}; 模板 结构S{}; 我不明白为什么上面的代码是不允许的,而下面的代码是不允许的 template< class T1, class T2, class = std::enable_if</*...*/> > struct S{}; template 结构S{}; < C++ >
template< class... Ts, class = std::enable_if</*...*/> >
struct S{};
模板
结构S{};
我不明白为什么上面的代码是不允许的,而下面的代码是不允许的
template< class T1, class T2, class = std::enable_if</*...*/> >
struct S{};
template
结构S{};
< C++ >标准中声明变量参数包必须是最后的(作为模板类的包;对于函数,存在不同的规则)。
所以在第二种情况下,没有变量参数包。所以这是允许的
如果你想知道为什么C++标准指出变量参数包必须是最后一个,那么大部分是因为没有人给出一个有说服力的理由来解释为什么它应该被改变。
通过将variardic包放在最后,匹配规则将变得更简单(variardic包匹配所有内容)和清晰。一旦你加上“哦,你可以加默认值”或其他什么,措辞就会变得更加复杂,最好的选择也会变得更加混乱
template<class... Ts, class Tail>
struct foo {};
模板
结构foo{};
应该foo
传递double
到Tail
?还是应该失败?谈论这件事,你可能会泼出一大堆墨水
那么模板专门化呢?我不寒而栗
用它来表示enable\u if
东西不会很畅销,因为这里的概念解决了大多数enable\u if
子句的问题。当然int
和double
会进入…Ts
,而Tail
则是无法实现的。而且不允许将Tail
设置为非默认值。使用C++也需要大约2年的时间。20@Adler我认为答案试图解释你所说的是一个有效的选择,但不一定是唯一有效的选择。如何选择?无论选择什么,它都会让事情变得更加复杂,相对而言,只需要很少的时间gain@formerlyknownas_463035818,我可以争辩,但我明白你的意思。我不想在这里说点什么,我所希望的只是“一个真正的技术原因”,我想这就是it@Adler真正的原因是因为标准如此规定:P@formerlyknownas_463035818,我喜欢这样的答案,就像我不知道那样。标准说了很多东西,有些是不好的。我认为社区是驱动力,而不是委员会(尽管他们做了困难的部分),了解决策原因(有很多原因)是很好的。