模板,良好形成和零包长度规则

时间:2017-09-30 12:33:37

标签: c++ c++11 language-lawyer variadic-templates well-formed

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)。

如果有一个空的参数包必须是空的(因此我的例子应该很好地形成,因为两个参数包都不能为空)或者在如果在每个专业化中至少有一个空的参数包,在每个专业化中都不一定相同(所以我的例子应该是格式错误的),这是不正确的感觉?

0 个答案:

没有答案