我最近碰到了以下情况:
#include <iostream>
int *p = 0;
int f() {
p = new int(10);
return 0;
}
void g(int x, int *y = p) {
std::cout << y << std::endl;
}
int main() {
g(f());
}
这非常微妙,因为您通常不希望在评估函数调用期间更改默认参数。我不得不看一下程序集来发现这个错误。
现在我的问题是:这是否真的是未定义的行为,因为没有关于函数参数评估顺序的任何保证?
答案 0 :(得分:13)
如果我理解正确,请致电
g(f());
相当于
g(f(), p);
由于声明
void g(int x, int *y = p);
g
函数f()
和p
的参数可以按任意顺序进行评估,因此您可以通过g
分配y
要么为零(如果首先评估p
,则返回其初始值)或新分配的数组指针(如果先评估f()
,则为p
分配一个新值作为其副作用)。