學習C 新特性(二)

2021-10-12 13:02:05 字數 1125 閱讀 7808

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 編譯器處理...