1、右值引用
c++11之前,
左值:表示式之後還持久存在的物件;
右值:表示式結束後不存在的臨時物件;
c++11之後
右值分純右值、將亡值;
純右值:純粹的字面量(如 10,true)或者求值結果相當於字面量或匿名臨時物件。(字串字面量只有在類中是右值,在普通函式中是左值)。
將亡值:即將被銷毀卻能移動的值。
右值引用:t && 將臨時物件傳遞給變數,使得將亡值延續。
使用move可以將左值改為右值引用
string s1="this is "; // s1w為左值
string&& yr1 = move(s1); yr1是右值引用 ok
string&& yr1 = s1; fail
移動語義
利用move來使得原來物件傳遞的拷貝 析構等過程簡化
v.push_back(str); // 將使用 push_back(const t&), 即產生拷貝行為
std::cout << "str: " << str << std::endl; // 將輸出 "str: hello world."
v.push_back(std::move(str));
// 將使用 push_back(const t&&), 不會出現拷貝行為
// 而整個字串會被移動到 vector 中,所以有時候 std::move 會用來減少拷貝出現的開銷
// 這步操作後, str 中的值會變為空
std::cout << "str: " << str << std::endl; // 將輸出 "str: "
左引用:c++11之前,引用都是左引用,加了const的常引用可以看作右引用
右引用 加上 && 來表示的為右引用
const int& f= 1; //可以看作右引用
int && d = 2; // 右引用
d = 12;
引用坍縮規則可以使得只有當 實參為右引用時才能被推導為右引用型別。
完美轉換 使用std::forward(value) 來實現**引用的型別與實參型別保持一致
C 11新特性學習筆記(二)
c 11引入了lambda 匿名函式 這樣就可以在乙個函式只需呼叫一次的地方使用了,類似內聯函式。c 11 的 lambda 表示式規範如下 capture params mutable exception attribute ret 1 capture params ret 2 capture p...
c 11 新特性 (二)
1.nullptr 專門形容指標為空 2.強類列舉 enum direction enum answer 3靜態斷言,可在編譯時作判斷 static assert size of int 4 4.建構函式的相互呼叫 delegating constructor class a a int x,int...
C 11新特性 二
目錄 default,delete 配合建構函式和拷貝賦值 一起使用 alias template template typedef type alias別名 using noexcept override final decltype lambda 右值引用 對於乙個空的class c 編譯器處理...