Недавно я столкнулся со следующей ситуацией:
#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());
}
Это довольно тонко, поскольку вы обычно не ожидаете, что аргументы по умолчанию будут меняться во время их оценки для вызова функции. Я должен был взглянуть на сборку, чтобы обнаружить эту ошибку.
Теперь мой вопрос: Это действительно поведение undefined, так как нет никаких гарантий относительно порядка оценки аргументов функции?