程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++11新特性之 rvalue Reference(右值引用)

C++11新特性之 rvalue Reference(右值引用)

編輯:C++入門知識

C++11新特性之 rvalue Reference(右值引用)


右值引用可以使我們區分表達式的左值和右值。

C++11引入了右值引用的概念,使得我們把引用與右值進行綁定。使用兩個“取地址符號”:

int&& rvalue_ref = 99;

需要注意的是,只有左值可以付給引用,如:

int& ref = 9;   

我們會得到這樣的錯誤: “invalid initialization of non-const reference of type int& from an rvalue of type int”

我們只能這樣做:

int nine = 9;
int& ref = nine;

看下面的例子,你會明白的:

#include 

void f(int& i) { std::cout << lvalue ref:  << i << 
; }
void f(int&& i) { std::cout << rvalue ref:  << i << 
; }

int main()
{
    int i = 77;
    f(i);    // lvalue ref called
    f(99);   // rvalue ref called

    f(std::move(i));  // 稍後介紹

    return 0;
}

右值有更隱晦的,記住如果一個表達式的結果是一個暫時的對象,那麼這個表達式就是右值,同樣看看代碼:

#include 

int getValue ()
{
    int ii = 10;
    return ii;
}

int main()
{
    std::cout << getValue();
    return 0;
}

這裡需要注意的是 getValue() 是一個右值。

我們只能這樣做,必須要有const

const int& val = getValue(); // OK
int& val = getValue(); // NOT OK

但是C++11中的右值引用允許這樣做:

const int&& val = getValue(); // OK
int&& val = getValue(); //  OK

現在做一個比較吧:

void printReference (const int& value)
{
        cout << value;
}

void printReference (int&& value)
{
        cout << value;
}

第一個printReference()可以接受參數為左值,也可以接受右值。
而第二個printReference()只能接受右值引用作為參數。

In other words, by using the rvalue references, we can use function overloading to determine whether function parameters are lvalues or rvalues by having one overloaded function taking an lvalue reference and another taking an rvalue reference. In other words, C++11 introduces a new non-const reference type called an rvalue reference, identified by T&&. This refers to temporaries that are permitted to be modified after they are initialized, which is the cornerstone of move semantics.

#include 

using namespace std;

void printReference (int& value)
{
        cout << lvalue: value =  << value << endl;
}

void printReference (int&& value)
{
        cout << rvalue: value =  << value << endl;
}

int getValue ()
{
    int temp_ii = 99;
    return temp_ii;
}

int main()
{ 
    int ii = 11;
    printReference(ii);
    printReference(getValue());  //  printReference(99);
    return 0;
}
/*----------------------
輸出
lvalue: value = 11
rvalue: value = 99
----------------------*/

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved