1

我理解经典示例的问题

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

但我无法说服自己以下内容是否有效

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

bar(foo(i), i);

我知道评估的顺序 'foo(i)' 和 'i' 是未定义的,但 'evaluated' 究竟是什么意思?即 bar 的第二个参数是否总是 42,或者 'i' 的当前值是否可以在 foo 更改之前传入?

4

2 回答 2

4

不,不能保证。
函数参数的评估顺序是未指定的[Ref 1]
有可能是:

  • foo(i)首先被评估或
  • i被评估或
  • 任何其他魔法命令(如果参数数量超过两个

在此上下文中未指定意味着允许实现以任何他们想要的方式实现所述功能,并且不需要记录。


[参考 1]
C++03 5.2.2 函数调用第 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 回答