Obiekty tymczasowe

Obiekt tymczasowy to nienazwany obiekt utworzony przez kompilator do przechowywania wartości tymczasowej.

Uwagi

W niektórych przypadkach kompilator musi utworzyć obiekty tymczasowe. Takie obiekty tymczasowe mogą być utworzone z następujących powodów:

  • Aby zainicjować const odwołanie za pomocą inicjatora typu innego niż źródłowy typ inicjowanego odwołania.

  • Aby przechowywać wartość zwracaną funkcji zwracającej typ zdefiniowany przez użytkownika (UDT). Te tymczasowe operacje są tworzone tylko wtedy, gdy program nie kopiuje wartości zwracanej do obiektu. Przykład:

    UDT Func1();    //  Declare a function that returns a user-defined
                    //   type.
    
    ...
    
    Func1();        //  Call Func1, but discard return value.
                    //  A temporary object is created to store the return
                    //   value.
    

    Ponieważ wartość zwracana nie jest kopiowana do innego obiektu, tworzony jest obiekt tymczasowy. Częstszy przypadek tworzenia obiektów tymczasowych występuje w trakcie obliczania wyrażenia, w którym muszą zostać wywołane funkcje przeciążonego operatora. Te przeciążone funkcje operatora zwracają typ zdefiniowany przez użytkownika, który często nie jest kopiowany do innego obiektu.

    Rozważ wyrażenie ComplexResult = Complex1 + Complex2 + Complex3. Obliczane jest wyrażenie Complex1 + Complex2, a wynik jest przechowywany w obiekcie tymczasowym. Następnie wyrażenie tymczasowe+ Complex3 jest obliczane, a wynik jest kopiowany do ComplexResult (przy założeniu, że operator przypisania nie jest przeciążony).

  • Aby przechować wynik rzutowania na typ zdefiniowany przez użytkownika. Gdy obiekt danego typu jest jawnie konwertowany na typ zdefiniowany przez użytkownika, nowy obiekt jest konstruowany jako obiekt tymczasowy.

Obiekty tymczasowe mają okres istnienia zdefiniowany przez ich punkt tworzenia i punkt ich zniszczenia. Każde wyrażenie tworzące więcej niż jeden obiekt tymczasowy ostatecznie niszczy je w odwrotnej kolejności tworzenia.

W przypadku wystąpienia tymczasowego zniszczenia zależy od sposobu jego użycia:

  • Tymczasowe używane do inicjowania const odwołań:
    Jeśli inicjator nie jest wartością l tego samego typu co zainicjowane odwołanie, zostanie utworzony tymczasowy typ obiektu bazowego. Jest inicjowany przez wyrażenie inicjalizacji. Ten obiekt tymczasowy jest niszczony natychmiast po tym, jak obiekt referencyjny, do którego jest powiązany. Ponieważ to zniszczenie może się zdarzyć również po wyrażeniu, które utworzyło tymczasowe, czasami jest określane jako rozszerzenie okresu istnienia.

  • Tymczasowo utworzone jako efekt oceny wyrażeń:
    Wszystkie czasy, które nie mieszczą się w pierwszej kategorii i które są tworzone jako efekt oceny wyrażenia, są niszczone na końcu instrukcji wyrażenia (czyli na średnik) lub na końcu wyrażeń sterujących dla for, if, while, doi switch instrukcji.

Zobacz też

Blog Herb Sutter na temat odwołań, po prostu