3

标准大师的问题。

试图回答另一个问题时,我开始怀疑代码的格式是否正确。

据我所知,以下代码格式错误

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

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

因为对std::get<I>(t), whent是 a的调用std::tuple<Ts...>是不正确的 when Iis outside the range [0, sizeof...(Ts)[

在这种情况下sizeof...(Ts)为零,因此范围[0, 0[为空,因此std::get<I>(a)对于每个 index 都是格式错误的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)为零),是格式正确还是格式错误?

4

1 回答 1

6

[温度分辨率]/8

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

  • [...]
  • 可变参数模板的每个有效特化都需要一个空模板参数包,或者
  • [...]
于 2017-09-28T17:19:23.920 回答