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 集計:

initializer-clause 内の完全な式は、出現順に評価されます。

于 2012-08-21T04:15:26.133 に答える