返回值和右值引用的傳遞問題實測

2021-08-28 20:15:34 字數 1225 閱讀 4136

class test2  

test2(const char* str);

test2(const test2& o);

test2(test2&& o);

virtual ~test2();

test2& operator=(const test2& o);

test2& operator=(test2&& o);

void swap(test2& o);

const char* cstr() const

protected:

char* _blocks; // 儲存字串的緩衝區

};

可以看到,這個類中包含了c++11標準中規定的若干元素:

其中,關鍵的幾個函式實現如下:

#include#include/**

* 引數構造器

* @param [in] str 字串值

*/test2::test2(const char* str) :

_blocks(null)

int main()

int main()

int main()

{ test2 t4 = return_right_reference2();

std::cout《結論:(執行失敗,沒有輸出)

這段**執行的結果和「第二個函式」一樣,返回區域性變數的引用(不管是左值還是右值)都不會有正確結果。

最後發現,最樸素的寫法反而是執行效率最高的寫法(「第乙個函式」),這種寫法充分的利用了編譯器在構造物件時進行的優化以及move賦值運算帶來的優勢,避免了物件在傳遞過程中產生的臨時物件以及引發的構造和析構;這也體現了move賦值運算存在的必要性。

無論如何,都不能在函式內部返回臨時變數的指標或引用,無論該引用是左值引用還是右值引用。c++11也從來沒有認為變數的控制權被轉移後析構就不再發生了。所以要在函式內部產生乙個物件並返回,正確的做法是:1)將物件建立在堆記憶體上並返回位址;2)返回區域性物件,並通過copy複製運算子在函式外複製該區域性物件的副本;3)返回區域性物件(是乙個右值),並通過move複製運算子將返回的區域性物件轉移到另乙個物件中;

move函式不能亂用,c++在一些場合下,隱含著右值的概念(比如函式返回值就是右值),此時將值進行型別轉換都會導致額外的不必要開銷(例如將返回值必須是「右值」,如果將其轉為「右值引用」,編譯器仍要生成**將其轉回「右值」的物件,等於做了一堆無用功)。

變數的引用 函式返回值傳遞引用

def test num print 在函式內部 d 對應的記憶體位址是 d num,id num 1 定義乙個字串變數 result hello print 函式要返回資料的記憶體位址是 d id result 2 將字串變數返回,返回的是資料的引用,而不是資料本身 return result 1...

返回值與返回引用的問題

此處小論一下返回值與返回引用的問題。先看程式 include using namespace std classx x x intii x x void x modify if 0x f5 此處返回的是x類的引用,當函式結束,呼叫析構函式,釋放記憶體。endif if 1x f5 endif voi...

左值和右值,左值引用和右值引用

左值 lvalue 這一術語 於c語言,用來指代那些可以用在賦值表示式左側的東西,具名物件 在棧和堆上分配的物件,或者其他物件的成員,總之就是又確定儲存空間的東西。而術語右值 rvalue 也是源自c語言,指的是只能在賦值表示式右側出現的東西,如字面值和臨時物件。只能繫結到左值,不能繫結到右值的引用...