1. 程式人生 > >C++11右值引用簡介

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. 左值標識物件的身份,右值標識物件的值(我把它理解為被物