左值有地址,為社麼還要std::move()?

村雨sup發表於2024-08-01

我把左值傳入函式,左值有地址不是可以直接進行移動嗎,為什麼還要轉為右值?

原因:一般函式都有設定左值引用的介面和右值引用的介面,右值就是為了傳入引數後銷燬原引數,左值引用就是為了保護原引數而進行深複製。所以一般想實現移動語義就用右值引用的介面。

在 C++ 中,移動語義的核心思想是透過右值引用來實現資源的轉移。右值引用允許我們區分出那些可以安全地“偷走”資源的物件(即右值),從而避免不必要的複製操作。雖然左值有地址,但它們通常表示持久的、需要保留的物件,因此不能直接移動它們的資源。
為什麼需要 std::move
1. 區分左值和右值:左值通常表示持久的物件,而右值表示臨時物件或即將銷燬的物件。透過將左值顯式轉換為右值引用,std::move 告訴編譯器這個物件可以被“偷走”資源。
2. 啟用移動語義:移動建構函式和移動賦值運算子是專門為右值引用設計的。只有當引數是右值引用時,這些函式才會被呼叫。

相關文章