第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么非Const引用不能綁定到臨時(shí)對(duì)象?

為什么非Const引用不能綁定到臨時(shí)對(duì)象?

C++ C
哆啦的時(shí)光機(jī) 2019-05-30 13:37:47
為什么非Const引用不能綁定到臨時(shí)對(duì)象?為什么不允許獲取對(duì)臨時(shí)對(duì)象的非Const引用,哪個(gè)函數(shù)getx()退貨?很明顯,這是C+標(biāo)準(zhǔn)所禁止的,但我對(duì)這種限制的目的感興趣,不是參考達(dá)到標(biāo)準(zhǔn)。struct X{     X& ref() { return *this; }};X getx() { return X();}void g(X & x) {}    int f(){     const X& x = getx(); // OK     X& x = getx(); // error     X& x = getx().ref(); // OK     g(getx()); //error     g(getx().ref()); //OK     return 0;}很明顯,對(duì)象的生存期不能成為原因,因?yàn)閷?duì)象的持續(xù)引用是不受禁止C+標(biāo)準(zhǔn)。顯然,在上面的示例中,臨時(shí)對(duì)象不是常量,因?yàn)樵试S調(diào)用非常量函數(shù)。例如,ref()可以修改臨時(shí)對(duì)象。此外,ref()允許您欺騙編譯器,并獲得到這個(gè)臨時(shí)對(duì)象的鏈接,從而解決我們的問題。此外:他們說“將一個(gè)臨時(shí)對(duì)象分配給Const引用延長(zhǎng)了該對(duì)象的生存期”,并且“盡管沒有提到非Const引用”。我的附加問題。之后的賦值是否延長(zhǎng)了臨時(shí)對(duì)象的生存期?X& x = getx().ref(); // OK
查看完整描述

3 回答

?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

在你的代碼中getx()返回一個(gè)臨時(shí)對(duì)象,稱為“rvalue”。您可以將rvalue復(fù)制到對(duì)象(也就是。或者將它們綁定到Const引用(這將延長(zhǎng)它們的生存期,直到引用的生命周期結(jié)束)。不能將rvalue綁定到非Const引用。

這是一個(gè)刻意的設(shè)計(jì)決定,目的是防止用戶意外修改將在表達(dá)式末尾死亡的對(duì)象:

g(getx()); // g() would modify an object without anyone being able to observe

如果要這樣做,則必須首先創(chuàng)建一個(gè)本地副本或?qū)ο蟮谋镜馗北?,或者將其綁定到Const引用:

X x1 = getx();const X& x2 = getx(); // extend lifetime of temporary to lifetime of const referenceg(x1); // fineg(x2); 
// can't bind a const reference to a non-const reference

注意,下一個(gè)C+標(biāo)準(zhǔn)將包括rvalue引用。因此,你所知道的“引用”正在被稱為“l(fā)value引用”。您將被允許將rvalue綁定到rvalue引用,并且可以在“rvalue-ness”上重載函數(shù):

void g(X&);   // #1, takes an ordinary (lvalue) referencevoid g(X&&);  // #2, takes an rvalue referenceX x; g(x);      
// calls #1g(getx()); // calls #2g(X());    // calls #2, too

rvalue引用背后的思想是,由于這些對(duì)象無論如何都會(huì)死掉,所以您可以利用這些知識(shí)并實(shí)現(xiàn)所謂的“移動(dòng)語(yǔ)義”,這是一種特定的優(yōu)化:

class X {
  X(X&& rhs)
    : pimpl( rhs.pimpl ) // steal rhs' data...
  {
    rhs.pimpl = NULL; // ...and leave it empty, but deconstructible
  }

  data* pimpl; // you would use a smart ptr, of course};X x(getx()); // x will steal the rvalue's data, leaving the temporary object empty


查看完整回答
反對(duì) 回復(fù) 2019-05-30
  • 3 回答
  • 0 關(guān)注
  • 983 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)