std::Move 與std::Forward:理解右值語意
在C 程式設計中,右值引用與暫時物件起著至關重要的作用優化程式碼效能的作用。兩個關鍵函數 std::move 和 std::forward 用於操作這些實體。
std::Move
Std::move 接受一個物件按值並將其視為臨時值(右值)。通常,採用右值引用的函數將在使用後使原始物件失效。透過使用 std::move,您明確指示不應再使用該對象,並且可以為其指派新值。
std::Forward
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
以上是std::move 與 std::forward:我什麼時候應該使用它們進行完美轉送?的詳細內容。更多資訊請關注PHP中文網其他相關文章!