c++11——move/forward


std::move

    c++11中提供了std::move()來將左值轉換為右值,從而方便的使用移動語義。move是將對象的狀態或者所有權從一個對象轉移到另一個對象,只是轉移,沒有內存拷貝。 
    c++中所有容器都實現了move語義,方便我們實現性能優化。move只是轉移了資源的控制權,本質上是將左值強制轉換為右值引用,以用於move語義,避免含有資源的對象發生無謂的拷貝。move對於擁有形如對內存、文件句柄等資源的成員的對象有效。如果是一些基本類型,比如int或char[10]數組等,如果使用move,仍然會發生拷貝(因為沒有對應的移動構造函數),所以move對於含資源的對象來說更有意義。

    std::list<std::string> tokens;
    std::list<std::string> t = std::move(tokens); //發生了移動構造。list在實現的時候,是將目的對象的資源句柄賦值為源對象的資源句柄,而將源對象的資源句柄清空。

 

std::forward

    右值引用類型是獨立於值的,一個右值引用參數作為函數的形參,在函數內部再轉發該參數的時候它已經變成一個左值,並不是他原來的類型。

如果我們需要一種方法能夠按照參數原來的類型轉發到另一個函數,這種轉發類型稱為完美轉發

template<typename T>
void print(T& t){
    cout << "lvalue" << endl;
}
template<typename T>
void print(T&& t){
    cout << "rvalue" << endl;
}

template<typename T>
void TestForward(T && v){
    print(v);
    print(std::forward<T>(v));
    print(std::move(v));
}

int main(){
    TestForward(1);
    int x = 1;
    TestForward(x);
    TestForward(std::forward<int>(x));
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM