這篇爲了理解,自己瞎寫的,建議看下面這篇,裏面例子很好很有用
https://blog.csdn.net/u011726005/article/details/79874539 //這篇很好
左值右值參考:
https://www.cnblogs.com/jiangbin/p/7066950.html?utm_source=itdadao&utm_medium=referral
左值就是=號左邊的值,可以被賦值,可以取地址。
右值就是=號右邊的的值,不能被賦值
v.push_back(A(25));
A(25) 實參是右值,臨時的。 類對象的非引用方式的返回值也是右值,拷貝完就扔。移動語義就是在碰到傳遞右值的時候觸發移動構造函數或者移動賦值操作符,從而避免不必要的拷貝。上面push_back()會調用push_back(T&&)版本
A aObj(25); // lvalue
v.push_back(aObj);
aObj是左值,會調用push_back(const T&) 版本。
右值引用:https://www.jianshu.com/p/d19fc8447eaa
A && a=getTemp() //getTemp函數 返回值形參是 A ,實參是A(), 通過右值引用,可以讓返回的臨時A一直生存下去,生命期和a一樣。
移動語義參考:
https://blog.csdn.net/wangshubo1989/article/details/49748703
移動語義可以避免不必要的拷貝,其實對象以引用方式傳遞就可以避免拷貝了。如果形參是非引用,那麼傳遞右值(比如A())會引發移動構造函數(這個右值傳遞完就會丟棄 太浪費了 沒有必要再拷貝) 避免不必要的拷貝,但是傳遞左值還是不會觸發移動拷貝構造函數,會按原來的方式拷貝 可以強行加上std::move(aObj) 強行觸發 但是要注意移動構造函數可能把傳遞的左值清空。
std::vector<int> GetNums() {
std::vector<int> nums;
nums.push_back(1);
nums.push_back(2);
return nums;
}
std::vector<int> result = GetNums(); //調用vector的移動拷貝構造函數,避免了拷貝
標準庫的容器vector,string等實現了移動拷貝語義,所以這些容器作爲函數的局部對象時都可以直接返回。
移動語義總結:類通過定義移動語義可以在需要移動場景的地方用它,從而避免一些不必要的拷貝。主要用在不用的話內存東西也扔了的情況,不用白不用,比如傳遞臨時變量,返回局部對象。
基於移動語義和非移動語義的函數重載:push_back(T&&)和push_back(const T&)會區別對待傳遞過來的左值和右值,比如左值不改右值改。