透過函數的值和隱含的移動規則傳回命名物件
考慮透過以下方式傳回泛型類別的物件的情況來自函數的值。在範例1 中:
輸出為:
在此範例中,為我在函數中建立的LValue 物件呼叫建構函式test(),並且移動當透過值傳回物件i 時,會呼叫建構子test(test&& s),因為表達式return i 是右值參考。
在範例2 中,提供了複製建構子test(test& z),但編譯器不會合成移動建構子:
輸出與範例1 相同:
使用複製建構函數,因為沒有可用的移動建構函數。
在範例3 中,移動建構函式被明確刪除:
嘗試編譯此程式碼將導致錯誤,因為刪除的移動建構函式意味著無法執行移動操作.
在範例4 中,即使刪除了移動建構函數,程式碼也會編譯並執行:
輸出:
在此範例中, r (u) 透過複製物件u 建立一個新物件r。移動構造函數沒有被使用,因為它被刪除了,而是使用了複製構造函數。
關鍵的一點是,是否使用移動建構函式取決於可行的移動建構函式的可用性以及以下規則:過載決議。如果移動建構函數可用且可行,則它可以用於初始化函數的傳回值,即使用於傳回值的表達式是 LValue。
以上是C 中什麼時候使用 Move 建構子以值傳回命名物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!