我理解
的经典例子的问题int i=0;
foo(i++, i++);
但我不能说服自己以下是有效还是无效
int foo(int& i)
{
i=42;
return 99;
}
bar(foo(i), i);
据我所知,'foo(i)'和'i'的评估顺序是未定义的,但'评估'究竟是什么意思?也就是说bar的第二个参数总是42,或者在foo改变它之前可以传入'i'的当前值吗?
答案 0 :(得分:4)
不能保证。
函数参数的评估顺序为未指定 [Ref 1] 。
它可能是:
foo(i)
或i
获得评估或在此上下文中未指定意味着允许实现以他们想要的方式实现所述功能,并且无需记录。
[参考1]
C ++ 03 5.2.2函数调用
第8段
参数的评估顺序未指定。参数表达式求值的所有副作用在输入函数之前生效。后缀表达式和参数表达式列表的评估顺序未指定。
答案 1 :(得分:0)
此样本(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。
所以真的不能保证。