为什么无法在可变参数模板中将尾随模板参数指定为默认值?

Why is it not possible to specify trailing template parameters as default in a variadic template?

本文关键字:参数 默认值 变参 为什么      更新时间:2023-10-16

是否有真正的技术原因不允许

template< class... Ts, class = std::enable_if</*...*/> >
struct S{};

我不明白为什么上面的代码是不允许的,下面的代码是

template< class T1, class T2, class = std::enable_if</*...*/> >
struct S{};

C++ 标准规定可变参数包必须是最后一个(作为模板类的包;对于函数,存在不同的规则(。

因此,在第二种情况下,您没有可变参数包。 所以这是允许的。

如果你想知道为什么C++标准规定可变参数包必须是最后一个,主要是因为没有人给出令人信服的论据,为什么应该改变它。

通过最后使用可变包,匹配规则将更简单(可变包匹配所有内容(和清晰。 一旦你添加了"哦,你可以添加默认值"或其他什么,措辞就会变得更加棘手,最好的选择会变得更加混乱。

template<class... Ts, class Tail>
struct foo {};

foo<int, double>应该double传递给Tail吗? 还是应该失败? 谈论这个,你可以洒出墨水的海洋。

那么模板专业化呢? 我不寒而栗。

将其用于enable_if东西不会是一个强有力的销售,因为概念就在这里,可以解决大多数(如果不是全部(enable_if条款问题。