C++11右值引用簡介
C++11右值引用
- 最近做的某個專案,由於與國外的某些東西有關。接觸到很多C++11、C++14的語法。一方面不時驚歎居然能這麼寫,另一方面覺得國外的技術確實比國內的發達,至少很多國內覺得新的技術,國外已經應用了許久了。
左值與右值
- 左值:可以簡單理解為,能用在等號左邊,也能用在等號右邊的值。
- 右值:可以簡單理解為,只能用在等號右邊的值。
// 變數a是個左值, 字面量10是個右值。 int a = 10; // 函式返回值是個左值 int x; int& getL() { return x; } // 函式的返回值,也可以是個右值 int getR() { int y = 10; return y; }
- 總結:進一步的理解,可以為:
**左值:**擁有相對穩定的記憶體,內容可修改(非const)。並且這塊記憶體的內容可反覆使用的值。
**右值:**擁有不穩定的記憶體,內容不可修改。一般來講,在使用後該記憶體即被釋放的值(不能反覆使用)。
左值引用與右值引用
- 左值引用:很常見,其實就是C++常說的引用型別
int a = 10;
// 左值引用
int& b = a;
// 形參為左值引用
void fun(int& a)
{
// somd code
}
- 為什麼要存在右值引用?
關於這個問題,在知乎上看到過一個比較經典的解釋,大概是:
如何把大象從冰箱A放到冰箱B中?
C++:首先,開啟冰箱A;啟動量子複製程式,複製大象,生成克隆大象。
開啟冰箱B。啟動量子複製程式,複製克隆大象,將其複製到冰箱B中。
然後,啟動銷燬程式,清除掉克隆大象。
上述過程,類似C++如下程式碼
int a = 10;
int b = a;
// 然後銷燬a
- 右值引用:使用右值引用,可以避免上述問題所產生的不必要的開銷,
// 如果用g++編譯,請加上 -std=c++1
// 右值引用
int&& rv = 10;
int b = rv;
// 函式返回右值引用
int&& getRvalueInt()
{
return std::move(b);
}
- 右值引用:C++11加入了右值引用後,導致類中新增了轉移建構函式,這一概念。
Class A { public: A() {} // 拷貝建構函式 A(const A& other) {} // 轉移建構函式 // 其實,就是把other,當作右值來用,減少了額外的開銷 A(A&& other) {} private: int* m_Array; }
- 右值引用還有很多的用法,以及延伸知識,網上有很多資料,可以深入瞭解。
相關推薦
C++11右值引用簡介
C++11右值引用 最近做的某個專案,由於與國外的某些東西有關。接觸到很多C++11、C++14的語法。一方面不時驚歎居然能這麼寫,另一方面覺得國外的技術確實比國內的發達,至少很多國內覺得新的技術,國
C++11 右值引用(1)
先參考上一節 C++11 左值 右值 ,本節是右值引用的基礎及判斷方法。 一 右值引用 C++11新增的右值引用概念,用&&表示。 二 引用型別 引用型別 可以引用的值類別 備註
C++11右值引用、完美轉發foward、可變模板引數例項
#include <iostream> using namespace std; struct A{ int x; A(int _x):x(_x){ co
C++11 右值引用(4)std::forward
一 例子 先看一段程式碼,然後分析。 #include <iostream> void out(int& t) { cout << "out T&" << endl; } void out(int&&
C++11--右值引用(移動語義)
/*################################################################## * 右值引用 (C++ 11) * 主要用於以下: * 1. 移動語義 * 2. 完美傳參 Perfect Forwarding
c++11右值引用的繫結規則
右值引用的繫結規則 右值引用(rvalue reference,&&)跟傳統意義上的引用(reference,&)很相似,為了更好地區分它們倆,傳統意義上的引用又被稱為左值引用(lvalue reference)。下面簡單地總結了左值引用和右值引
C++11--右值引用(Perfect Forwarding)
/* * 右值引用 2: Perfect Forwarding */ void foo( boVector arg ); // boVector既有移動構造又有拷貝構造 template< typename T > void relay(T arg ) { foo(arg);
C++11 右值引用
轉載自:http://www.cnblogs.com/hujian/archive/2012/02/13/2348621.html C++ 11中引入的一個非常重要的概念就是右值引用。理解右值引用是學習“移動語義”(move semantics)的基礎。而要理解右
C++11右值引用實際使用示例
class CXyString { /* 用於交換物件內容 */ friend void swapObj(CXyString & o1, CXyString & o2); //也可以直接在這裡實現這個函式 private: char * m_buff; size_t m_cap;
關於C++11右值引用的一個誤解
關於右值引用的一個誤解 C++11引入了右值引用,但是如果不深入瞭解而望文生義的使用,會造成一些誤解。在處理函式返回的時候會有這種典型錯誤。 一個錯誤使用的例子 函式 foo()返回物件X,有的親可能想返回右值引用。 X foo () {
C++11——右值引用
C++中的引用允許你為以及存在的物件建立一個新的名字。對新引用所做的訪問和修改操作,都會影響到它的原型(被引用的物件)。 例如: int var = 2; int& ref = var; ref = 9; // ref = 9; // var =
C++ 11 右值引用以及std::move
新型別: int和int&是什麼?都是型別。int是整數型別,int&則是整數引用型別。同樣int&&也是一個型別。兩個引號&&是C++ 11提出的一個新的引用型別。記住,這是一個新的型別。默唸1
【轉】c++之右值引用
從左值右值到右值引用 地址:https://www.cnblogs.com/inevermore/p/4029753.html C++98中規定了左值和右值的概念,但是一般程式設計師不需要理解的過於深入,因為對於C++98,左值和右值的劃分一般用處不大,但是到了C++11,它的重要性
右值引用簡介(中英文對照)
[譯註:本文介紹的“右值引用”是C++11的新特性] A Brief Introduction to Rvalue References by Howard E. Hinnant, Bjarne Stroustrup, and Bronek Kozicki March 1
C++11的右值引用
右值引用 語法 factor htm 類型 har start 移動 hand 右值引用是C++11 引入的新特性。它解決了兩類問題:實現移動語義和完美轉發。本文大絕大部分內容,來自於文章:http://kuring.me/post/cpp
[轉載][C++]C++11 左值、右值、右值引用詳解
找到 延長 引用 () 字面量 別名 賦值 例子 左值 我之前以為左值就是等號左邊的值,右值就是等號右邊的值。 我 太天真 ?_? 原文地址:https://blog.csdn.net/hyman_yx/article/details/52044632 (侵刪 ------
C++11之右值引用與移動構造
添加 oooo 返回對象 oat 值引用 apc 定義 tco pri ----------------------------右值引用--------------------------------- 右值定義: 通俗來講,賦值號左邊的就是左值,賦值號右邊的就
c++11:物件移動 & 右值引用 & 移動建構函式
一、概述 c++ 11 新標準中最主要的特徵是可以移動而非拷貝物件的能力。很多情況下,物件拷貝後就會立即被銷燬。 在這些情況下,移動而非拷貝物件會大幅度提升效能。 在舊 C++ 標準中,沒有直接的方法移動物件。因此,即使不必要拷貝物件的情況下,我們也不得不拷貝。如果物件本身要求
C++11:右值引用、移動語意與完美轉發
在C++11之前我們很少聽說左值、右值這個叫法,自從C++11支援了右值引用之後,大多數人會像我一樣疑惑:啥是右值? 準確的來說: 左值:擁有可辨識的記憶體地址的識別符號便是一個左值。 右值:非左值。 左值引用:左值識別符號的一個別名,簡稱引用
C++11新特性之右值引用
什麼是左值,什麼是右值? An l-value expression refers to an object's identity, whereas a r-value expression refers to an object's value. 左值標識物件的身份,右值標識物件的值(我把它理解為被物