標籤:

【源碼眾讀】之問題解答,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 |