首頁 >後端開發 >C++ >std::move 與 std::forward:我什麼時候應該使用它們進行完美轉送?

std::move 與 std::forward:我什麼時候應該使用它們進行完美轉送?

Barbara Streisand
Barbara Streisand原創
2024-12-15 13:24:10161瀏覽

std::move vs. std::forward: When Should I Use Each for Perfect Forwarding?

std::Move 與std::Forward:理解右值語意

在C 程式設計中,右值引用與暫時物件起著至關重要的作用優化程式碼效能的作用。兩個關鍵函數 std::move 和 std::forward 用於操作這些實體。

std::Move

Std::move 接受一個物件按值並將其視為臨時值(右值)。通常,採用右值引用的函數將在使用後使原始物件失效。透過使用 std::move,您明確指示不應再使用該對象,並且可以為其指派新值。

std::Forward

Std::forward 有一個獨特的用途:將模板化函數參數轉換為與呼叫者預期相同的值類別(左值或右值)。這實現了“完美轉發”,允許右值參數作為右值傳遞,左值作為左值傳遞。

主要差異

  • Std::forward 保留物件的生命週期,而 std::move 表示該物件將無效。
  • Std::forward 在函數範本中用於將參數轉送到另一個函數,並保持其值類別。
  • Std::move 通常用於指示該物件是臨時的並且不應進一步使用。

何時使用每個函數

  • 當你想將一個物件標記為臨時並允許其失效時使用std::move。
  • 當你需要傳遞時使用std::forward從函數模板到另一個函數的參數,保留其值類別。

示例:

考慮以下代碼:

void overloaded( const int& arg ) { std::cout << "by lvalue\n"; }
void overloaded( int&& arg ) { std::cout << "by rvalue\n"; }

template<typename T>
void forwarding( T&& arg ) {
    std::cout << "via std::forward: ";
    overloaded( std::forward<T>(arg) );
    std::cout << "via std::move: ";
    overloaded( std::move(arg) ); // conceptually this would invalidate arg
    std::cout << "by simple passing: ";
    overloaded( arg );
}

int main() {
    std::cout << "initial caller passes rvalue:\n";
    forwarding( 5 );
    std::cout << "initial caller passes lvalue:\n";
    int x = 5;
    forwarding( x );
}

輸出:

initial caller passes rvalue:
via std::forward: by rvalue
via std::move: by rvalue
by simple passing: by rvalue
initial caller passes lvalue:
via std::forward: by lvalue
via std::move: by lvalue
by simple passing: by lvalue
  • 傳遞右值(5) 時,std::forward 和std::move保留其作為右值的狀態。
  • 傳遞左值(x) 時,std::forward 保持其左值狀態,而std::move 嘗試移動它,假設使其無效(儘管在這個例子中,編譯器對此進行了優化)。

以上是std::move 與 std::forward:我什麼時候應該使用它們進行完美轉送?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn