C ++ 11:Variadic模板函数参数包扩展执行顺序

时间:2012-08-21 03:52:37

标签: c++ c++11 variadic-templates variadic-functions

请考虑以下代码:

template<class T>
size_t f(T t, size_t& x) { return x++; }

template<class... Args>
void g(Args... args)
{
    size_t x = 0;
    size_t y[] = { f(args, x)... };

    for (size_t i = 0; i < sizeof...(args); i++)
        assert(y[i] == i);
}

C ++ 11标准保证的断言不会触发吗?为什么或为什么不呢?

1 个答案:

答案 0 :(得分:7)

是的,保证不会开火。请参阅以下引号:

§14.5.3可变参数模板:

  

包扩展可以在初始化列表中发生;模式是   初始化子句。

§8.5.1聚合:

  

初始化子句中的完整表达式在   它们出现的顺序。