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

And*_*zos 6 c++ variadic-functions variadic-templates c++11

请考虑以下代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*vid 7

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

§14.5.3Variadic模板:

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

§8.5.1聚合:

初始化子句中的完整表达式按它们出现的顺序进行评估.

  • @Luc实际上我推荐使用`T {pattern(args)...}方法来处理数组方法,比如`int dummy [] = {pattern(args)...}`方法,因为后者是恶意的当`args`为空时形成. (5认同)