rückgabetyp string
-
Hallo!
string test() { string s ("ABC"); return s; } int main() { string t = test(); return 0; }Die Funktion test erzeugt ein Objekt vom Typ string und gibt dieses Objekt zurück.
Ist das so machbar, oder ist das falsch, weil das Objekt lokal erzeugt wurde?
-
dein lokal erzeugter string in test() wird in string t bei der RÜckgabe KOPIERT.
Daher ist es egal ob string s noch weiter existiert oder nicht.
Alles korrekt soweit.
-
Richtig.
-
Korrekt.
-
frag0r schrieb:
Die Funktion test erzeugt ein Objekt vom Typ string und gibt dieses Objekt zurück. Ist das so machbar, oder ist das falsch, weil das Objekt lokal erzeugt wurde?
Das kann man so machen, ja. Falsch ist es nicht. Beantworter sagte, dass der string kopiert wird. Das stimmt allerdings nicht so ganz. Es kommt auf Deinen Compiler drauf an, ob er "copy elisions" durchführen kann. Mein G++ 4.3.3 Compiler erzeugt genau ein string-Objekt direkt in t und da wird gar nichts kopiert. Garantiert wird das allerdings vom C++ Standard auch nicht. Bei einem string ist das aber echt noch egal. Ich würd's so lassen.
Ich hatte auch neulich darüber gebloggt. Wen's interessiert:
C++: Exploiting Copy ElisionsGruß,
SP
-
Sebastian Pizer schrieb:
...Mein G++ 4.3.3 Compiler erzeugt genau ein string-Objekt direkt in t ...
Ich denke, da liegt der entscheidende Punkt! Soweit ich weiß, garantiert der Standard, dass das Ergebnis so wäre, als ob eine Kopie angefertigt würde.
Das angesprochene Problem (Übergabe eines lokalen Objekts) ist durchaus real und relevant ... aber eben nur bei Referenzen und Pointern (und ähnlichen "Verweisstrukturen" wie Handleobjekten, IDs, ....).
Schon ein einziges "&" hätte da den Unterschied gemacht... und vielleicht kommt der Fragesteller ja auch aus Java und "sieht" überall Referenzen, wo keine sind.
Gruß,
Simon2.
-
Simon2 schrieb:
Das angesprochene Problem (Übergabe eines lokalen Objekts) ist durchaus real und relevant ... aber eben nur bei Referenzen und Pointern (und ähnlichen "Verweisstrukturen" wie Handleobjekten, IDs, ....).
Ja, jetzt erinnere ich mich wieder, die Referenzen!
Ist schon ein paar Jahre her, meine C++ Praxis!

Danke an alle,
Gruß,
f.
-
Simon2 schrieb:
Sebastian Pizer schrieb:
...Mein G++ 4.3.3 Compiler erzeugt genau ein string-Objekt direkt in t ...
Ich denke, da liegt der entscheidende Punkt! Soweit ich weiß, garantiert der Standard, dass das Ergebnis so wäre, als ob eine Kopie angefertigt würde.
Der Standard erlaubt explizit das Weglassen von Kopien in bestimmten Kontexten -- auch dann, wenn Konstruktoren und Destruktoren Seiteneffekte haben.
Nachlesen kann man das im Standard oder in N1905.pdf, Kapitel 12.8, Absatz 15. (Das ist ein auf dem C++03 Standard basierender C++0x Entwurf, wo praktisch noch kein C++0x enthalten ist).
Gruß,
SP
-
Sebastian Pizer schrieb:
...
Der Standard erlaubt explizit das Weglassen von Kopien in bestimmten Kontexten -- auch dann, wenn Konstruktoren und Destruktoren Seiteneffekte haben....Das glaube ich ... aber das war nicht der Punkt, auf den ich hinauswollte (und den ich offensichtlich unzureichend verdeutlicht habe): Er fordert aber (egal, wie der Compiler das umsetzt), dass der Aufrufer hinterher ein gültiges/"lebendes" Objekt in den Händen hält.
Ich wollte auf die Lebenszeit hinaus, die ja beim Thema "Rückgabe von temporären Objekten" das Problem darstellt.
Aber gut, dass Du diesen Effekt noch dazu beigetragen hast - ich lerne immer viel aus Deinen fundierten und doch sehr verstädlichen Beiträgen - Danke!

Gruß,
Simon2.