【源碼眾讀】之問題解答,Part_3
最近在忙三件事情:1. 籌備婚禮;2. 找裝修公司;3. 幫堂弟的鴨脖開個網店。
學習的時間有點少,不過既然選擇了開始,慢慢爬也要把這個源碼給讀完!
話不多說,咱們繼續
問題1
Json(std::string &&value); Json(array &&values); Json(object &&values);
&&是什麼意思?
疑問
&&是什麼意思?
解題思路
看了下書的目錄,沒找到這個符號,於是百度,得知這東西叫右值引用,再回去找書就容易啦
P471
解答
所謂右值引用就是必須綁定到右值的引用
只能綁定到一個將要銷毀的對象
是新標準為了支持移動操作引入的
那麼什麼是移動操作呢?
在某些情況下,對象拷貝後就立即被銷毀了。在這些情況下,移動而非拷貝對象會在幅度提升性能
對於IO類或unique_ptr這樣的類,它們都包含不能被共享的資源。因此,這些類型的對象不能拷貝但可以移動。
和普通引用一樣,右值引用也只是某個對象的別名而已。區別就在於右值引用綁定的是一個將要銷毀的對象
int i = 42; int &r = i; int &&rr = i; int &r2 = i * 42; const int &r3 = i * 42; int &&rr2 = i * 42;
其中rr和r2的定義是錯誤的
左值持久;右值短暫
左值有持久的狀態,而右值要麼是字面常量,要麼是在表達式求值過程中創建的臨時對象
int &&rr1 = 42; int &&rr2 = rr1;
其中rr2的定義是錯誤的,因為rr1是變數,是持久的,而右值引用只能綁定到臨時對象
標準庫move函數
如果想讓右值引用綁定到左值對象上,可以使用標準庫提供的move函數
int &&rr3 = std::move(rr1);
調用move後,只能對rr1進行兩種操作:賦值和銷毀
std::move定義在頭文件utility中
參考資料
c++ primer 471
推薦閱讀:
※《C++ Primer》讀書筆記-第十二章 02 動態數組
※我的CUDA學習之旅1——大圖像分塊處理程序
※GeekBand C++面向對象高級編程(上)1
※C++中的deleting destructor
※static_cast<const char*>("Fuck GTK+")
TAG:C |
