代码之家  ›  专栏  ›  技术社区  ›  max66

病态呼叫的零长度变量展开

  •  3
  • max66  · 技术社区  · 7 年前

    another question ,我开始怀疑代码的良好形式。

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

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

    std::get<I>(t) 什么时候 t 是一个 std::tuple<Ts...> I [0, sizeof...(Ts)[ .

    sizeof...(Ts) [0, 0[ 是空的,所以 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<>();
     }
    

    使用格式不正确的(?)呼叫( 标准::获取(<);I>(a) )但零时间变量扩展了( sizeof...(I)

    1 回复  |  直到 7 年前
        1
  •  6
  •   T.C. Yksisarvinen    7 年前

    [temp.res]/8 :

    如果出现以下情况,则程序格式不正确,无需诊断:

    • 可变模板的每个有效专门化都需要一个空的模板参数包,或者