Wird ein temporärer Teil eines Arguments für einen Funktionsaufruf erstellt, der garantiert bleibt, bis die aufgerufene Funktion endet, auch wenn das temporäre Element nicht direkt an die Funktion übergeben wird?Wann werden Provisorien, die im Rahmen eines Funktionsaufrufs erstellt wurden, zerstört?
ist es so gut wie keine Chance, dass kohärent war, also hier ein Beispiel:
class A {
public:
A(int x) : x(x) {printf("Constructed A(%d)\n", x);}
~A() {printf("Destroyed A\n");}
int x;
int* y() {return &x;}
};
void foo(int* bar) {
printf("foo(): %d\n", *bar);
}
int main(int argc, char** argv) {
foo(A(4).y());
}
Wenn A(4)
wurden direkt an foo
weitergegeben, es wäre auf jeden Fall erst nach dem foo
Anruf beendet zerstört werden, sondern ich rufe eine Methode auf der temporären und verlieren jegliche Bezugnahme darauf. Ich würde instinktiv denken, dass die temporäre A
würde zerstört werden, bevor foo
startet sogar, aber das Testen mit GCC 4.3.4 zeigt, ist es nicht; der Ausgang ist:
Konstruiert A (4)
foo(): 4
Zerstörte A
Die Frage ist, ist GCC das Verhalten durch die spec garantiert? Oder ist es einem Compiler erlaubt, das temporäre A
vor dem Aufruf an foo
zu zerstören, den Zeiger auf seinen Member ungültig zu machen, den ich verwende?
Ehrfürchtig zerstört Dank Ihnen und Jerry für den Verweis in der Spezifikation zu finden, hatte ich Schwierigkeiten, es –