Re: Auswertereihenfolge bei Funktionsaufruf
Von: Andreas Huennebeck (acmh@gmx.de) [Profil]
Datum: 19.06.2008 14:20
Message-ID: <6bv17qF3dqdllU1@mid.individual.net>
Newsgroup: de.comp.lang.iso-c++
Datum: 19.06.2008 14:20
Message-ID: <6bv17qF3dqdllU1@mid.individual.net>
Newsgroup: de.comp.lang.iso-c++
Hubert Schmid wrote: > ich habe eine sehr spezielle Frage zur Auswertereihenfolge beim > Funktionsaufruf. Ich dachte, ich hätte die Frage schon einmal in > dieser Newsgroup gestellt, konnte aber nichts dazu finden. Es gebt um > folgendes Konstrukt: > > postfix-expression ( [ expression-list ] ) > > Laut 5.2.2(8) ist die Auswertereihenfolge der postfix-expression und > der (argument-)expression-list unspezifiziert. Ich kann allerdings > nichts dazu finden, wann die Initialisierung der Funktionsparameter > erfolgt. Ich vermute, dass diese in der Auswertung der Argumente > implizit dabei ist, bin mir aber nicht sicher. Ich möchte wissen, ob > garantiert ist, dass die Parameter erst nach Auswertung der > postfix-expression initialisiert werden. > > Das konkrete Beispiel zu dieser Frage sieht so aus: > > struct foo > { > void run(std::auto_ptr<foo> self); > }; > > int main() > { > std::auto_ptr<foo> bar(new foo); > bar->run(bar); > } > > Ist dieser Code korrekt, das heißt wird bar als postfix-expression > ausgewertet, bevor es als Parameter kopiert wird? Ich sehe hier vor allem das Problem, daß foo::run() keine (const) Referenz als Argument hat. Das bedeutet, daß eine Kopie von 'self' gemacht wird, die beim Verlassen von foo::run() entsorgt wird. Soweit so gut, aber man muß wissen, daß der Kopierkonstruktor von std::auto_ptr den gehaltenen Zeiger an die Kopie weitergibt und vom kopierten Objekt entfernt (damit garantiert nur einmal 'delete' für diesen Zeiger gerufen wird). Das bedeutet, daß für den in 'bar' gehaltenen Zeiger am Ende von run() 'delete' gerufen wird. Das ist sicher nicht beabsichtigt. Abhilfe: struct foo { void run(std::auto_ptr<foo>& self); void run(const std::auto_ptr<foo>& self); }; Davon abgesehen halte ich diese Konstruktion für sehr unglücklich. Was willst Du eigentich machen? Tschau Andreas -- Andreas Hünnebeck | email: acmh@gmx.de ----- privat ---- | www : http://www.huennebeck-online.de Fax/Anrufbeantworter: 0721/151-284301 GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc[ Auf dieses Posting antworten ]
