1

の古典的な例の問題を理解しています

int i=0;
foo(i++, i++);

しかし、私は以下が有効か無効かについて自分自身を納得させることができません

int foo(int& i)
{
   i=42;
   return 99;
}

bar(foo(i), i);

「foo(i)」と「i」が評価される順序が定義されていないことは理解していますが、「評価される」とは正確にはどういう意味ですか? つまり、bar の 2 番目のパラメーターは常に 42 になりますか、それとも 'i' の現在の値を foo が変更する前に渡すことができますか?

4

2 に答える 2

4

いいえ、保証されません。
関数への引数の評価順序は未指定[参照 1]です。
次のいずれかが考えられます。

  • foo(i)最初に評価されるか、
  • i評価されたり
  • その他の魔法の順序 (引数の数が 3 つ以上の場合)

このコンテキストで指定されていないということは、実装が任意の方法で前述の機能を実装することが許可されており、文書化する必要がないことを意味します。


[参照 1]
C++03 5.2.2 関数呼び出し Para 8

引数の評価順序は規定されていません。引数式の評価のすべての副作用は、関数に入る前に有効になります。後置式と引数式リストの評価順序は規定されていません。

于 2012-05-29T11:32:04.133 に答える
1

このサンプル (gcc 4.6)

#include <iostream>
using namespace std;

int foo(int& i)
{
    i=42;
    return 99;
}

void bar(int i, int j)
{
    cout << "i = " << i << "; j = " << j << endl;
}

int main()
{
    int i =10;
    bar(foo(i), i);
    return 0;
}

i = 99、j = 10 が得られます。

したがって、実際には保証されません。

于 2012-05-29T11:35:39.880 に答える