c++ - todas - tipos de funciones en c
Orden de evaluaciĆ³n de argumentos de funciĆ³n y argumentos por defecto (2)
Recientemente me encontré con la siguiente situación:
#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());
}
Esto es bastante sutil, ya que normalmente no espera que los argumentos predeterminados cambien durante su evaluación para la llamada a la función. Tuve que echar un vistazo a la asamblea para detectar este error.
Ahora mi pregunta es: ¿es este comportamiento realmente indefinido, ya que no hay garantías con respecto al orden de evaluación de los argumentos de función?
El orden de evaluación (es decir, la determinación del valor) de los argumentos de la función no se especifica. El compilador es libre de ejecutarlos en cualquier orden, e incluso se entremezcla si no hay otros factores que lo impidan.
La evaluación de los argumentos predeterminados ocurre en el contexto de la persona que llama, no de la persona que llama. Entonces, la llamada a f () es necesaria para un argumento, y leer la variable global p para el otro. No se especifica en qué orden ocurre esto, por lo que se puede leer el global antes o después de la llamada a f ().
Si lo entiendo correctamente, tu llamada.
g(f());
es equivalente a
g(f(), p);
debido a la declaración
void g(int x, int *y = p);
Y los argumentos de la función g
, f()
y p
, pueden evaluarse en cualquier orden, por lo que puede llamar a g
con y
asignada a cero (si p
se evalúa primero, luego devuelve su valor inicial) o la nueva matriz asignada el puntero (si f()
se evalúa primero y asigna un nuevo valor a p
como su efecto secundario).