5

この非可変個の例では:

int     Func1();
double  Func2();
void    MyFunc( int, double );

int  main()
{
    MyFunc( Func1(), Func2() );
    //...
}

またはが最初に計算されるかどうFunc1()かは指定されていませんが、呼び出されるFunc2()前に両方を実行する必要があるだけです。MyFunc()

この順序付けは、可変引数の展開でどのように機能しますか?

template < typename Func, typename ...Args >
void  MyFunc2( Func &&f, Args&& ...a )
{
    int  b[] = { f( std::forward<Args>(a) )... };
    //...
}

fそれが、最初の呼び出し後に状態を変更する関数オブジェクトであるとしましょう。?fの各セグメントに対して順番に呼び出されaます。つまり、展開されたリストをランダムにスキップするのではなく、 のリストのf最初の項目、次に 2 番目の項目、3 番目の項目などで呼び出されますか? a各アイテム間にシーケンス ポイントと呼ばれていたものはありますか?

4

1 に答える 1

5

はい、中括弧で囲まれた初期化子リストは左から右の評価順序を保証しますが、関数呼び出しは保証しません。したがって、MyFunc2正しくシーケンスされます。

ウィキペディアの記事ではこれについて説明しています: https://en.wikipedia.org/wiki/Variadic_templates

各アイテム間にシーケンス ポイントと呼ばれていたものはありますか?

いいえ、コンマ トークンを使用していますがコンマ演算子ではありません。

于 2012-05-26T08:52:21.470 に答える