函数参数和默认参数的评估顺序

时间:2015-08-26 09:09:25

标签: c++ undefined-behavior operator-precedence default-parameters

我最近碰到了以下情况:

#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());
}

这非常微妙,因为您通常不希望在评估函数调用期间更改默认参数。我不得不看一下程序集来发现这个错误。

现在我的问题是:这是否真的是未定义的行为,因为没有关于函数参数评估顺序的任何保证?

1 个答案:

答案 0 :(得分:13)

如果我理解正确,请致电

    g(f());

相当于

    g(f(), p);

由于声明

    void g(int x, int *y = p);

g函数f()p的参数可以按任意顺序进行评估,因此您可以通过g分配y要么为零(如果首先评估p,则返回其初始值)或新分配的数组指针(如果先评估f(),则为p分配一个新值作为其副作用)。