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

C++11: Variadic Template Function Parameter Pack Expansion Execution Order

本文关键字:扩展 顺序 执行 包扩展 参数 函数 C++11      更新时间:2023-10-16

考虑以下代码:

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标准是否保证断言不会被激发?为什么?

是的,它保证不会开火。请参阅以下报价:

§14.5.3可变模板:

包扩展可以出现在[…]初始值设定项列表中;模式是初始值设定项子句。

§8.5.1骨料:

初始值设定项子句中的完整表达式在它们出现的顺序。