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

max*_*x66 3 c++ templates well-formed variadic-templates c++11

标准大师的问题.

试图回答另一个问题,我开始怀疑代码的良好构成.

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

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

   std::get<0>(a);
 }
Run Code Online (Sandbox Code Playgroud)

因为std::get<I>(t),当ta是a时std::tuple<Ts...>,调用I是在范围之外时形成的[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<>();
 }
Run Code Online (Sandbox Code Playgroud)

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

T.C*_*.C. 6

[temp.res]/8:

如果出现以下情况,该计划格式错误,无需诊断:

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