日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

右值引用

發(fā)布時(shí)間:2024/3/26 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 右值引用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

右值引用

1. 什么是右值引用

右值引用是C++11新加的一種引用類型,是一種僅能綁定到右值上的引用。不同于左值引用僅用一個(gè)&表示,右值引用用兩個(gè)&&表示。

int x{ 5 }; int& lref{ x }; // l-value refrence initialized with l-value x int&& rref{ 5 } // r-value refrence initialized with r-value 5

右值引用有兩個(gè)非常有用的性質(zhì): 1. 右值引用將初始化他們的對(duì)象的壽命延長(zhǎng)到右值引用的壽命;2. 非常量的右值引用允許修改右值。

看一個(gè)實(shí)際例子:

#include <iostream>class Fraction { private:int m_numerator;int m_denominator;public:Fraction(int numerator = 0, int denominator = 1) :m_numerator{ numerator }, m_denominator{ denominator }{}friend std::ostream& operator<<(std::ostream& out, const Fraction &f1){out << f1.m_numerator << '/' << f1.m_denominator;return out;} };int main() {auto &&rref{ Fraction{ 3, 5 } }; // r-value reference to temporary Fraction// f1 of operator<< binds to the temporary, no copies are created.std::cout << rref << '\n';return 0; } // rref (and the temporary Fraction) goes out of scope here

這段代碼打印出:

3/5

Fraction{ 3, 5 }是一個(gè)匿名對(duì)象(臨時(shí)對(duì)象),在這行語句結(jié)束的時(shí)候就出了作用域,本來應(yīng)該被銷毀掉,但是我們用了一個(gè)右值引用來綁定它,因此延長(zhǎng)了它的生命期,直到main函數(shù)結(jié)束,局部變量rref被銷毀的時(shí)候,這個(gè)臨時(shí)對(duì)象才會(huì)被銷毀。
再看另外一個(gè)例子:

#include<iostream> int main() {int &&ref{ 5 };rref = 10;std::cout << rref << std::endl;return 0; }

這段代碼執(zhí)行結(jié)果是:

10

這里用字面值初始化一個(gè)右值引用,會(huì)創(chuàng)建一個(gè)臨時(shí)對(duì)象,我們可以通過右值引用來修改這個(gè)對(duì)象。

2. 右值引用作為函數(shù)參數(shù)

右值引用最有用的地方在于作為函數(shù)參數(shù),尤其是在寫重載函數(shù)時(shí),希望對(duì)傳入的左值和右值表現(xiàn)出不同的行為。

void fun(const int& lref) {std::cout << "l-value reference to const." << std::endl; } void fun(int &&rref) {std::cout << "r-value reference." << std::endl; }int main() {int x{ 5 };fun(x); // l-value argument calls l-value version of fun()fun(5); // r-value argument calls r-value version of fun()return 0; }

這段代碼打印出:

l-value reference to const. r-value reference.

可以看出,當(dāng)傳入的參數(shù)是左值時(shí),調(diào)用的是左值版本的fun(), 當(dāng)傳入的參數(shù)是右值時(shí),調(diào)用的是右值版本的fun()??墒沁@有什么用呢?這對(duì)于移動(dòng)語義來說是一個(gè)非常重要的特性,后面會(huì)繼續(xù)討論。
再看一個(gè)有意思的例子:

int &&ref{ 5 }; fun(ref);

ref是一個(gè)右值引用,那么fun(ref)調(diào)用的是右值引用版本嗎?事實(shí)上,這里調(diào)用的是左值版本的fun()函數(shù)。雖然ref是一個(gè)右值引用,但是這僅說明它綁定的對(duì)象是一個(gè)右值,它本身是一個(gè)局部變量,是一個(gè)左值,因此這行代碼調(diào)用的是左值版本的fun()。

3. 不要返回右值引用

在絕大多數(shù)情況下,你都不應(yīng)該返回右值引用。因?yàn)橛抑狄媒壎ǖ膶?duì)象在出作用域之后就會(huì)被銷毀,因此從函數(shù)返回,你智能得到一個(gè)"hanging reference"。

參考資料

[1].https://www.learncpp.com/cpp-tutorial/15-2-rvalue-references/

總結(jié)

以上是生活随笔為你收集整理的右值引用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。