6

考虑以下代码:

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

4

1 回答 1

7

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

§14.5.3 可变参数模板:

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

§8.5.1 聚合:

初始化子句中的完整表达式按照它们出现的顺序进行计算。

于 2012-08-21T04:15:26.133 回答