Lebenszeit temporärer Objekte



  • Hallo Forum,

    kann mir jemand erklären, warum im folgenden Beispiel das temporäre Objekt den Funktionsaufruf überlebt?
    Ich würde verstehen, wenn das Objekt selbst an eine konstante Referenz gebunden würde, aber dieser Fall ist mir unklar.

    Vielen Dank schonmal!

    class Balla
    {
    public:
       Balla(int i) : m_I(i) { std::cout << "create B...\n"; }
       ~Balla() { std::cout << "destroy B...\n"; }
       int* GiveI() { std::cout << "give I...\n"; return &m_I; }
    private:
       int m_I;
    };
    
    int DoubleTheInt(int* leStart)
    {
       std::cout << "double arg...\n";
       return *leStart * 2;
    }
    
    int main()
    {
       auto res = DoubleTheInt(Balla(14).GiveI());
    
       return 0;
    }
    

    Output:

    create B...
    give I...
    double arg...
    destroy B...
    


  • Woran willst du hier erkannt haben, dass es den Aufruf überlebt?



  • Ich war jetzt anhand der Reihenfolge des Outputs (naiverweise?) davon ausgegangen, dass das so sein wird...
    Außerdem erhalte ich das erwartete Ergebnis als Rückgabe von DoubleTheInt.



  • Die Ausgabe zeigt doch eindeutig, dass das temporäre Objekt anschließend wieder zerstört wird.

    NuUseForAName schrieb:

    Außerdem erhalte ich das erwartete Ergebnis als Rückgabe von DoubleTheInt.

    Und das soll schlecht sein?



  • Achso, du meinst, das Objekt müsste gleich nach dem Aufruf von GiveI() zerstört werden? Das ist nicht so, temporäre Objekte werden erst beim Semikolon zerstört (oder formal ausgedrückt, am Ende der full-expression).



  • Ja, sorry, das war schlecht formuliert.
    Ich meinte genau das, was du jetzt schreibst. Ich wäre davon ausgegangen, dass das temporäre Objekt innerhalb des Funktionskörpers von DoubleTheInt bereits nicht mehr lebt.

    Das beantwortet eigentlich die Frage, danke!
    Wenn mir jemand einen Link liefern könnte, wo man das nochmal nachlesen kann, wäre ich trotzdem dankbar ;).



  • Hier steht z.B. alles wichtige zur Lebenszeit von Objekten:
    http://en.cppreference.com/w/cpp/language/lifetime



  • 👍 Danke!


Log in to reply