分享方式:


暫存物件

暫存物件是由編譯器建立的未命名物件,會用來儲存暫存值。

備註

在某些案例中,編譯器必須建立暫存物件。 可能需要建立這些暫存物件的原因如下:

  • 為了初始化 const 參考而使用的初始設定式類型,與所要初始化之參考的基礎類型初始設定式不同。

  • 為了儲存傳回使用者定義類型 (UDT) 之函式的傳回值。 只有在程式沒有將傳回值複製到物件時,才會建立這些暫存物件。 例如:

    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.
    

    由於傳回值不會複製到另一個物件,因此會建立暫存物件。 建立暫存物件的更常見案例是在評估運算式期間,必須呼叫多載運算子函式時。 這些多載運算子函式傳回的使用者定義類型通常不會複製到另一個物件。

    ComplexResult = Complex1 + Complex2 + Complex3 運算式為例。 Complex1 + Complex2 運算式會加以評估,而且結果會儲存在暫存物件中。 接著會評估運算式 temporary + Complex3,並將結果複製到 ComplexResult (假設指派運算子未多載)。

  • 為了將轉型的結果儲存為使用者定義類型。 當特定類型的物件明確轉換成使用者定義類型時,該新物件會建構為暫存物件。

暫存物件具有存留期,該存留期是從物件建立的時間點開始到終結的時間點為止。 任何建立多個暫存物件的運算式,最終都會依照物件建立的反向順序終結那些物件。

暫時性損毀的發生時機取決於其使用方式:

  • 初始化 const 參考所用的暫存物件:
    如果初始設定式不是與所要初始化的參考相同類型的 I 值,則會建立基礎物件類型的暫存物件。 並且會使用初始化運算式進行初始化。 這個暫存物件會在其所繫結的參考物件終結時立即終結。 由於在建立暫存物件的運算式之後就可能會發生此解構,因此其有時稱為存留期延長

  • 作為運算式評估效果而建立的暫存物件:
    所有不符合第一個類別的暫存物件,以及作為運算式評估效果而建立的暫存物件,都會在運算式陳述式 (也就是分號) 結尾或 forifwhiledoswitch 陳述式的控制運算式結尾遭到終結。

另請參閱

Herb Sutter 的部落格:References, simply