国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ 學(xué)習(xí)系列 1 -- 左值、右值與萬(wàn)能引用

這篇具有很好參考價(jià)值的文章主要介紹了C++ 學(xué)習(xí)系列 1 -- 左值、右值與萬(wàn)能引用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 何為左值?何為右值?

簡(jiǎn)單的說(shuō),左值可以放在等號(hào)的左邊,右值可以放在等號(hào)的右邊。

左值可以取地址,右值不能取地址。

1.1 左值舉例:
  • 變量、函數(shù)或數(shù)據(jù)成員
  • 返回左值引用的表達(dá)式 如 ++x、x = 1、cout << ' '? int x = 0
1.2 右值舉例:
  • 返回非引用類(lèi)型的表達(dá)式
    如 x++、x + 1
  • 除字符串字面量之外的字面量如 42、true
將亡值(xvalue)
  • 隱式或顯式調(diào)用函數(shù)的結(jié)果,該函數(shù)的返回類(lèi)型是對(duì)所返回對(duì)象類(lèi)型的右值引用
#include<string>
#include<iostream>
using namespace std;
void print(string& str)
{
    cout << "left val: " <<str << endl << endl;
}

void print(string&& str)
{
    cout << "right val: " << str <<endl << endl;
}



void print(int&& i)
{
    cout << "right val: " <<i << endl << endl;
}

void print(int& i)
{
    cout << "left val: " <<i << endl << endl;
}

int getVal(){
    return 666;
}

int main(int argc, char *argv[])
{
    string str1 = "hello 1";
    print(str1);
    print("hello 2");
    print(move(str1));

    int ab = 88;
    print(ab);
    print(++ab);
    print(ab++);

    print(getVal());

    //string& aa = "abc"; // 編譯不過(guò),左值引用不可以賦右值
    const string& bb = "abc"; // 常量左值引用可以賦右值


    return 0;
}

輸出:

C++ 學(xué)習(xí)系列 1 -- 左值、右值與萬(wàn)能引用,學(xué)習(xí)

?1.3 左值引用與右值引用

?

規(guī)則簡(jiǎn)化如下:

左值引用   {左值}  
右值引用   {右值}
常左值引用  {右值}
string f()
{
   return "bbb";
}

int main() 
{

  string &s1 = "asd";  // error
  const string &s2 = "asd";  // ok
  const string& s3 = f();  // ok
  
  string&& a2 = "defg"; // ok
  string&& a3 = f(); // ok
  
  return 0;
}
? 1.4 引入右值引用意義

? 可以延長(zhǎng)右值的生命周期,右值的生命周期可以與右值引用變量相同

2. 完美轉(zhuǎn)發(fā)

2.1? 轉(zhuǎn)發(fā)引用

在 T 是模板參數(shù)時(shí),T&& 的作用主要是保持值類(lèi)別進(jìn)行轉(zhuǎn)發(fā),它有個(gè)名字就叫“轉(zhuǎn)發(fā)引用”(forwarding reference)。因?yàn)榧瓤梢允亲笾狄?,也可以是右值引用,它也曾?jīng)被叫做“萬(wàn)能引用”(universal reference)。

#include<string>
#include<iostream>
using namespace std;
void print(const string& str)
{
    cout << "left val: " <<str << endl << endl;
}

void print(string&& str)
{
    cout << "right val: " << str <<endl << endl;
}

string ff()
{
    return "fff";
}

template<typename T>
void f(T&& param)
{
    print(forward<T>(param));
}

int main(int argc, char *argv[])
{
    string str1 = "hello 1";
    const string& bb = "abc";
    const string& bb2 = ff();


    f(str1); // left value
    f(bb); // left value
    f(bb2); // left value
    f("abcd"); // rightvalue
    f(ff()); // right value

    return 0;
}

輸出:

C++ 學(xué)習(xí)系列 1 -- 左值、右值與萬(wàn)能引用,學(xué)習(xí)

?2.2? 完美轉(zhuǎn)發(fā) std::forward
?2.1.1 源碼解析
  • 轉(zhuǎn)發(fā)左值
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type& __t) noexcept
{ return static_cast<_Tp&&>(__t); }

先通過(guò) remove_reference 獲得類(lèi)型type,定義_t為左值引用的左值變量,通過(guò)?static_cast?進(jìn)行強(qiáng)制轉(zhuǎn)換

  • 轉(zhuǎn)發(fā)右值
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
{
  static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument"
        " substituting _Tp is an lvalue reference type");
  return static_cast<_Tp&&>(__t);
}
? ?不同于轉(zhuǎn)發(fā)左值,_t為右值引用的左值變量,除此之外中間加了一個(gè)斷言,表示當(dāng)不是左值的時(shí)候,也就是右值,才進(jìn)行static_cast轉(zhuǎn)換。
2.1.2? remove_reference 解析
template<typename _Tp>
struct remove_reference
{ typedef _Tp   type; };

// 特化版本
template<typename _Tp>
struct remove_reference<_Tp&>
{ typedef _Tp   type; };

template<typename _Tp>
struct remove_reference<_Tp&&>
{ typedef _Tp   type; };

remove_reference的作用是去除T中的引用部分,只獲取其中的類(lèi)型部分。無(wú)論T是左值還是右值,最后只獲取它的類(lèi)型部分。

現(xiàn)代C++之萬(wàn)能引用、完美轉(zhuǎn)發(fā)、引用折疊 - 知乎 (zhihu.com)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-629737.html

到了這里,關(guān)于C++ 學(xué)習(xí)系列 1 -- 左值、右值與萬(wàn)能引用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MordernC++之左值(引用)與右值(引用)

    C++中左值與右值的概念是從C中繼承而來(lái),一種簡(jiǎn)單的定義是 左值能夠出現(xiàn)再表達(dá)式的左邊或者右邊,而右值只能出現(xiàn)在表達(dá)式的右邊 。 另一種區(qū)分左值和右值的方法是: 有名字、能取地址的值是左值,沒(méi)有名字、不能取地址的值是右值 。比如上述語(yǔ)句中a,b, c是變量可以

    2023年04月09日
    瀏覽(19)
  • 【C++11】左值引用和右值引用

    【C++11】左值引用和右值引用

    需要云服務(wù)器等云產(chǎn)品來(lái)學(xué)習(xí)Linux的同學(xué)可以移步/--騰訊云--/--阿里云--/--華為云--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶首次下單享超低折扣。 ??? 目錄 一、新的類(lèi)功能 1、新的默認(rèn)成員函數(shù) 2、類(lèi)成員變量初始化 3、強(qiáng)制生成默認(rèn)函數(shù)的default 4、禁止生成默認(rèn)函

    2023年04月17日
    瀏覽(24)
  • 【送書(shū)】【C++11】左值引用和右值引用

    【送書(shū)】【C++11】左值引用和右值引用

    需要云服務(wù)器等云產(chǎn)品來(lái)學(xué)習(xí)Linux的同學(xué)可以移步/--騰訊云--/--阿里云--/--華為云--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶首次下單享超低折扣。 ??? 目錄 一、新的類(lèi)功能 1、新的默認(rèn)成員函數(shù) 2、類(lèi)成員變量初始化 3、強(qiáng)制生成默認(rèn)函數(shù)的default 4、禁止生成默認(rèn)函

    2023年04月09日
    瀏覽(18)
  • 左值引用、右值引用,std::move() 的匯編解釋

    左值引用、右值引用,std::move() 的匯編解釋

    1:左值引用 引用其實(shí)還是指針,但回避了指針這個(gè)名字。由編譯器完成從地址中取值。以vs2019反匯編: 如圖,指針和引用的匯編代碼完全一樣。但引用在高級(jí)語(yǔ)言層面更友好,對(duì)人腦。比如可以少寫(xiě)一個(gè) * 號(hào)和 - 。 ,以下是指針和引用的使用: 以上就是左值引用,引用的

    2024年02月04日
    瀏覽(15)
  • C++ 左值和右值

    C++ 左值和右值

    在C++11中所有的值必屬于左值、右值兩者之一,右值又可以細(xì)分為純右值、將亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、沒(méi)有名字的就是右值(將亡值或純右值)。舉個(gè)例子,int a = b+c, a 就是左值,其有變量名為a,通過(guò)a可以獲取該變量的地址;

    2024年02月14日
    瀏覽(14)
  • C++左值右值完美轉(zhuǎn)發(fā)轉(zhuǎn)移

    英文含義: 左值(Lvalue) : Locator value ,意味著它指向一個(gè)具體的內(nèi)存位置。 右值(Rvalue) : Read value ,指的是可以讀取的數(shù)據(jù),但不一定指向一個(gè)固定的內(nèi)存位置。 定義 左值 :指的是一個(gè)持久的內(nèi)存地址。左值可以出現(xiàn)在賦值操作的左側(cè)或右側(cè)。例如,變量、數(shù)組的元

    2024年03月10日
    瀏覽(35)
  • C++面試八股文:什么是左值,什么是右值?

    某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第16面: 面試官:什么是左值,什么是右值? 二師兄:簡(jiǎn)單來(lái)說(shuō),左值就是可以使用 符號(hào)取地址的值,而右值一般不可以使用 符號(hào)取地址。 二師兄:一般左值存在內(nèi)存中,而右值存在寄存器中。 二師兄:嚴(yán)格意義上分,右值

    2024年02月09日
    瀏覽(17)
  • 【C++學(xué)習(xí)】C++11——新特性 | 右值引用 | 完美轉(zhuǎn)發(fā)

    【C++學(xué)習(xí)】C++11——新特性 | 右值引用 | 完美轉(zhuǎn)發(fā)

    ??作者:一只大喵咪1201 ??專欄:《C++學(xué)習(xí)》 ??格言: 你只管努力,剩下的交給時(shí)間! C++的發(fā)展截至到目前為止,雖然版本有很多,但是C++11則帶來(lái)了數(shù)量可觀的變化,其中包含了約140個(gè)新特性,以及對(duì)C++03標(biāo)準(zhǔn)中約600個(gè)缺陷的修正,這使得C++11更像是從C++98/03中孕育出的一

    2024年02月06日
    瀏覽(20)
  • C++:深入理解C++11新特性:Chapter3:左值和右值

    C++:深入理解C++11新特性:Chapter3:左值和右值

    在C語(yǔ)言中,我們常常會(huì)提起左值(lvalue),右值(rvalue)這樣的稱呼,而在編譯程序時(shí),編譯器有時(shí)也會(huì)報(bào)出錯(cuò)誤信息中包含 左值,右值說(shuō)法。不過(guò)左值、右值通常不是通過(guò)一個(gè)嚴(yán)謹(jǐn)?shù)亩x而為人所知。下面我通過(guò)這樣一個(gè)例子,來(lái)引導(dǎo)大家認(rèn)識(shí): 左值,右值,左值引用,右

    2024年02月04日
    瀏覽(102)
  • C++右值引用,右值引用與const引用的區(qū)別

    左值:可以取地址的、有名字的變量,有持久性; 右值:一般是不可尋址的常量,或在表達(dá)式求值過(guò)程中創(chuàng)建的無(wú)名臨時(shí)對(duì)象,短暫性的。 C++11新增了另一種引用——右值引用。這種引用可指向右值,使用聲明。 右值引用只能引用臨時(shí)變量和常量值。 const引用:可以引用普

    2024年01月18日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包