ich auf die folgende Situation vor kurzem lief:Auswertung der Reihenfolge der Funktionsargumente und Standardargumente
#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());
}
Dies ist sehr subtil, da man in der Regel nicht erwarten, die Standardargumente während ihrer Auswertung für den Funktionsaufruf ändern . Ich musste mir die Versammlung ansehen, um diesen Fehler zu erkennen.
Jetzt ist meine Frage: Ist das wirklich undefiniertes Verhalten, da es keine Garantien bezüglich der Bewertungsreihenfolge von Funktionsargumenten gibt?
"Die Auswertung der Standardargumente erfolgt im Kontext des Aufrufers" Haben Sie eine Referenz im aktuellen C++ - Standard für diesen Anspruch? – phlipsy
Es gibt eine nicht-normative Anmerkung in 1.9p11, die es ausdrücklich sagt. Abgesehen davon denke ich, dass dies nur durch mangelnde Unterscheidung von anderen Argumenten impliziert wird. –
@phlipsy siehe [dcl.fct.default]/9 "Standardargumente werden jedes Mal ausgewertet, wenn die Funktion aufgerufen wird. Die Reihenfolge der Auswertung der Funktion Argumente ist nicht spezifiziert.", Ich denke, das bedeutet eindeutig, dass 'g (f()) 'ist das gleiche wie' g (f(), p) ' –