从a previous question我接受的答案中我发现a rule我不了解模板和格式良好
该程序格式错误,无需诊断,如果:
- [...]
- 可变参数模板的每个有效特化都需要一个空模板参数包,或
- [...]
根据这条规则(如果我理解正确的话),以下模板功能是不正确的
template <typename ... Ts>
int foo (std::tuple<Ts...> const &)
{ return std::get<sizeof...(Ts)>(std::tuple<int>{42}); }
因为唯一有效的专门化需要并且空Ts...
参数包。
但是(也许是因为我不太懂英语)如果模板中有两个以上的参数包,我不太明白这条规则。
我的意思是......以下foo()
函数
#include <tuple>
#include <iostream>
template <typename ... Ts, typename ... Us>
int foo (std::tuple<Ts...> const &, std::tuple<Us...> const &)
{ return std::get<sizeof...(Ts)+sizeof...(Us)-1U>(std::tuple<int>{42}); }
int main ()
{
auto t0 = std::tuple<>{};
auto t1 = std::tuple<int>{0};
//std::cout << foo(t0, t0) << std::endl; // compilation error
std::cout << foo(t0, t1) << std::endl; // print 42
std::cout << foo(t1, t0) << std::endl; // print 42
//std::cout << foo(t1, t1) << std::endl; // compilation error
}
格式正确还是格式不正确?
因为有效的专业化要求Ts...
或 Us...
为空(并且其他参数包的大小恰好为1)。
如果有一个空的参数包必须是空的(因此我的例子应该很好地形成,因为两个参数包都不能为空)或者在如果在每个专业化中至少有一个空的参数包,在每个专业化中都不一定相同(所以我的例子应该是格式错误的),这是不正确的感觉?