Recentemente ho attraversò di corsa la seguente situazione:Valutazione ordine degli argomenti di funzione e gli argomenti di default
#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());
}
Questo è abbastanza sottile, dal momento che di solito non si aspettano gli argomenti di default di cambiare durante la loro valutazione per la chiamata di funzione . Ho dovuto dare un'occhiata all'assembly per individuare questo errore.
Ora la mia domanda è: È questo comportamento davvero non definito, dal momento che non ci sono garanzie che regolano l'ordine di valutazione degli argomenti delle funzioni?
"La valutazione degli argomenti predefiniti avviene nel contesto del chiamante" Hai un riferimento nello standard C++ corrente per questo reclamo? – phlipsy
C'è una nota non normativa in 1.9p11 che la dice esplicitamente. Oltre a questo, penso che sia solo implicito dalla mancanza di distinzione da altri argomenti. –
@phlipsy si veda [dcl.fct.default]/9 "Gli argomenti predefiniti vengono valutati ogni volta che viene chiamata la funzione L'ordine di valutazione degli argomenti della funzione non è specificato.", Penso che ciò implichi chiaramente che 'g (f()) 'è uguale a' g (f(), p) ' –