C 基本語法 移動語義 左值右值

2021-09-29 02:37:32 字數 1123 閱讀 2424

這篇為了理解,自己瞎寫的,建議看下面這篇,裡面例子很好很有用

//這篇很好

左值右值參考:

左值就是=號左邊的值,可以被賦值,可以取位址。

右值就是=號右邊的的值,不能被賦值

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&) 版本。

右值引用:

a && a=gettemp()  //gettemp函式 返回值形參是 a ,實參是a(), 通過右值引用,可以讓返回的臨時a一直生存下去,生命期和a一樣。

移動語義參考:

移動語義可以避免不必要的拷貝,其實物件以引用方式傳遞就可以避免拷貝了。如果形參是非引用,那麼傳遞右值(比如a())會引發移動建構函式(這個右值傳遞完就會丟棄 太浪費了 沒有必要再拷貝) 避免不必要的拷貝,但是傳遞左值還是不會觸發移動拷貝建構函式,會按原來的方式拷貝 可以強行加上std::move(aobj) 強行觸發 但是要注意移動建構函式可能把傳遞的左值清空。

std::vectorgetnums()

std::vectorresult = getnums();    //呼叫vector的移動拷貝建構函式,避免了拷貝

標準庫的容器vector,string等實現了移動拷貝語義,所以這些容器作為函式的區域性物件時都可以直接返回。

移動語義總結:類通過定義移動語義可以在需要移動場景的地方用它,從而避免一些不必要的拷貝。主要用在不用的話記憶體東西也扔了的情況,不用白不用,比如傳遞臨時變數,返回區域性物件。

基於移動語義和非移動語義的函式過載:push_back(t&&)和push_back(const t&)會區別對待傳遞過來的左值和右值,比如左值不改右值改。

C 11左值右值 轉移語義

首先看一下c 11標準新特性 右值引用 右值引用 rvalue referene 是 c 新標準 c 11,11 代表 2011 年 中引入的新特性 它實現了轉移語義 move sementics 和精確傳遞 perfect forwarding 它的主要目的有兩個方面 1 消除兩個物件互動時不必要...

c 左值 右值 右值引用 左值引用

c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...

c 左值 右值 左值引用 右值引用

在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...