不正常呼叫的零长度可变扩展

时间:2017-09-28 17:16:44

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

标准大师的问题。

尝试回复another question,我开始怀疑代码是否格式良好。

据我所知,以下代码格式不正确

int main ()
 {
   std::tuple<>  a;

   std::get<0>(a);
 }

因为当std::get<I>(t)超出范围tstd::tuple<Ts...> I的{​​{1}}时,[0, sizeof...(Ts)[的来电不正确。

在这种情况下,sizeof...(Ts)为零,因此范围[0, 0[为空,因此std::get<I>(a)的每个索引I的格式都不正确。

但当std::get<I>(a)通过空的可变参数包扩展时?

我的意思是:以下代码

#include <tuple>

template <typename ... Args>
void bar (Args const & ...)
 { }

template <std::size_t ... I>
void foo ()
 {
   std::tuple<> a;

   bar( std::get<I>(a) ... );
 }

int main ()
 {
   foo<>();
 }

使用格式错误的(?)调用(std::get<I>(a)),但零时变可扩展(sizeof...(I)为零),是否格式正确或格式不正确?

1 个答案:

答案 0 :(得分:6)

[temp.res]/8

  

该程序格式错误,无需诊断,如果:

     
      
  • [...]
  •   
  • 可变参数模板的每个有效特化都需要一个空模板参数包,或
  •   
  • [...]
  •