右值引用的一些測試

2021-10-11 20:22:13 字數 2328 閱讀 5411

編譯: g++ --std=c++11 -g -fno-elide-constructors -o0 test.cc -o test

-fno-elide-constructors 用來關閉編譯器優化

#include class a 

~a()

// 拷貝建構函式

a(const a &a) : _value(a._value)

// 移動建構函式

a(a &&a) : _value(a._value)

private:

int _value;

};

a test() 

int main(void)

編譯執行結果:

contructor value: 10

move contructor value: 10

destructor value: 10

move contructor value: 10

destructor value: 10

destructor value: 10

a test() 

int main(void)

編譯執行結果:

contructor value: 10

move contructor value: 10

destructor value: 10

destructor value: 10

a &&test() 

int main(void)

編譯執行結果:

contructor value: 10

destructor value: 10

a &&test() 

int main(void)

編譯執行結果:

contructor value: 10

destructor value: 10

move contructor value: -374511968

destructor value: -374511968

a &&test() 

int main(void)

編譯執行結果:

contructor value: 10

destructor value: 10

沒有定義移動建構函式的情況下:

contructor value: 10

copy contructor value: 10

destructor value: 10

copy contructor value: 10

destructor value: 10

destructor value: 10

contructor value: 10

copy contructor value: 10

destructor value: 10

destructor value: 10

contructor value: 10

destructor value: 10

contructor value: 10

destructor value: 10

copy contructor value: -298764640

destructor value: -298764640

contructor value: 10

destructor value: 10

當類中同時包含拷貝建構函式和移動建構函式時,如果使用臨時物件初始化當前類的物件,編譯器會優先呼叫移動建構函式來完成此操作。只有當類中沒有合適的移動建構函式時,編譯器才會退而求其次,呼叫拷貝建構函式。

預設情況下,左值初始化同類物件只能通過拷貝建構函式完成,如果想呼叫移動建構函式,則必須使用右值進行初始化。c++11 標準中為了滿足使用者使用左值初始化同類物件時也通過移動建構函式完成的需求,新引入了 std::move() 函式,它可以將左值強制轉換成對應的右值,由此便可以使用移動建構函式。

關於右值引用的一些理解

右值引用之前看過不少次了,但過一段時間就忘了,這裡簡單整理一下我的理解 右值引用主要用來實現 移動語義 和 完美 1.移動語義 使用上可以用std move 把引數強制轉換成右值 我理解就是和淺拷貝很像,不過淺拷貝是多個指標指向堆上的空間,可能會重複釋放從而出錯,而移動語義是只有乙個指標占有堆上的空...

關於C 的右值引用的一些看法

關於c 中的右值引用的詳細可以看這一批博文 從4行 看右值引用 那一篇博文詳細結合四行簡單的 詳細介紹了右值引用的使用方法和一些場景,非常實用。而本篇博文主要介紹一下我在學習右值引用的一些心得。因為在學習右值引用的時候,有一些地方非常難理解。所以寫下這一篇博文,防止遺忘,由於對於c 涉獵不多,所以有...

關於c 的 右值 右值引用 move

第一次接觸c move操作就懵逼了,一直想探個究竟,但是右值以及右值引用思考了好長時間,就是不得要領,今天終於有所收穫,寫下第一篇部落格,一方面為了幫助一些剛入門的朋友,另一方面也是幫助自己今後複習。左值是乙個持久的量,右值是乙個短暫的量。那怎麼算持久怎麼算短暫呢?取決於我的 裡有沒有乙個變數來儲存...