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

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

如何將唯一_PTR參數(shù)傳遞給構(gòu)造函數(shù)或函數(shù)?

如何將唯一_PTR參數(shù)傳遞給構(gòu)造函數(shù)或函數(shù)?

C++
慕無(wú)忌1623718 2019-07-03 11:02:22
如何將唯一_PTR參數(shù)傳遞給構(gòu)造函數(shù)或函數(shù)?我剛開(kāi)始在C+11中移動(dòng)語(yǔ)義,我不太清楚如何處理unique_ptr構(gòu)造函數(shù)或函數(shù)中的參數(shù)??紤]這個(gè)類引用自身:#include <memory>class Base{   public:     typedef unique_ptr<Base> UPtr;     Base(){}     Base(Base::UPtr n):next(std::move(n)){}     virtual ~Base(){}     void setNext(Base::UPtr n)     {       next = std::move(n);     }   protected :     Base::UPtr next;};我應(yīng)該這樣寫函數(shù)嗎unique_ptr爭(zhēng)吵?我需要用std::move在電話密碼里?Base::UPtr b1;Base::UPtr b2(new Base());b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?
查看完整描述

3 回答

?
楊__羊羊

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

以下是將唯一指針作為參數(shù)的可能方法,以及它們的相關(guān)含義。

(A)按價(jià)值計(jì)算

Base(std::unique_ptr<Base> n)
  : next(std::move(n)) {}

為了讓用戶調(diào)用它,他們必須執(zhí)行以下操作之一:

Base newBase(std::move(nextBase));Base fromTemp(std::unique_ptr<Base>(new Base(...));

通過(guò)值獲取唯一指針意味著轉(zhuǎn)移指向有關(guān)函數(shù)/對(duì)象/etc的指針的所有權(quán)。后newBase被建造,nextBase保證空空..你不擁有這個(gè)對(duì)象,你甚至沒(méi)有指向它的指針。它不見(jiàn)了。

這是確保的,因?yàn)槲覀儾捎昧藚?shù)的值。std::move實(shí)際上移動(dòng)什么都行,只是個(gè)花哨的演員而已。std::move(nextBase)返回Base&&的r值引用。nextBase..這就是它所能做的。

因?yàn)?/trans>Base::Base(std::unique_ptr<Base> n)根據(jù)值而不是r值引用它的論點(diǎn),C+將自動(dòng)為我們構(gòu)造一個(gè)臨時(shí)的。它創(chuàng)建一個(gè)std::unique_ptr<Base>Base&&我們通過(guò)std::move(nextBase)..實(shí)際上,這個(gè)臨時(shí)的建筑移動(dòng)nextBase函數(shù)參數(shù)n.

(B)非Const l值參考

Base(std::unique_ptr<Base> &n)
  : next(std::move(n)) {}

這必須在實(shí)際的l-值(一個(gè)命名變量)上調(diào)用。不能用這樣的臨時(shí)方式調(diào)用它:

Base newBase(std::unique_ptr<Base>(new Base)); //Illegal in this case.

它的含義與任何其他非const引用的含義相同:函數(shù)可以也可能不會(huì)聲明指針的所有權(quán)。鑒于此代碼:

Base newBase(nextBase);

不能保證nextBase是空的。它可以,可能是空的;它可能不是。這真的取決于什么Base::Base(std::unique_ptr<Base> &n)想做什么。因此,僅僅從函數(shù)簽名中可以看出將要發(fā)生的事情并不是很明顯;您必須閱讀實(shí)現(xiàn)(或相關(guān)的文檔)。

因此,我不建議把它作為一個(gè)接口。

(C)由Const l-

Base(std::unique_ptr<Base> const &n);

我沒(méi)有顯示一個(gè)實(shí)現(xiàn),因?yàn)槟?/trans>不可能從一個(gè)const&..通過(guò)一個(gè)const&,您是說(shuō)函數(shù)可以訪問(wèn)Base通過(guò)指針,但它不能商店任何地方。它不能聲稱擁有它的所有權(quán)。

這可能很有用。不一定適合你的具體情況,但總能給某人一個(gè)指針,并且知道他們不可能(不違反C+的規(guī)則,就像沒(méi)有拋棄const)聲稱擁有它的所有權(quán)。他們不能儲(chǔ)存。他們可以把它傳給別人,但其他人必須遵守同樣的規(guī)則。

(D)按r-

Base(std::unique_ptr<Base> &&n)
  : next(std::move(n)) {}

這與“非Const l-value Reference”的情況大致相同。區(qū)別是兩件事。

  1. 你,你們能,會(huì),可以臨時(shí)通過(guò):

    Base newBase(std::unique_ptr<Base>(new Base)); //legal now..
  2. 你,你們使用std::move在傳遞非臨時(shí)參數(shù)時(shí)。

后者才是真正的問(wèn)題。如果你看到這一行:

Base newBase(std::move(nextBase));

你有一個(gè)合理的期望,在這一行完成之后,nextBase應(yīng)該是空的。它應(yīng)該被移開(kāi)的。畢竟,你有std::move坐在那里告訴你運(yùn)動(dòng)已經(jīng)發(fā)生了。

問(wèn)題是它沒(méi)有。它不是被移出。它可以,可能已被移除,但您只能通過(guò)查看源代碼才能知道。您不能只從函數(shù)簽名中分辨出來(lái)。

建議

  • (A)按價(jià)值計(jì)算:

    如果你想讓一個(gè)函數(shù)聲稱

    所有權(quán)

    一種

    unique_ptr

    用價(jià)值來(lái)衡量。
  • (C)Const l-參考價(jià)值:

    如果您的意思是讓一個(gè)函數(shù)簡(jiǎn)單地使用

    unique_ptr

    在該函數(shù)執(zhí)行期間,請(qǐng)按

    const&

    ..或者,傳遞一個(gè)

    &

    const&

    指向的實(shí)際類型,而不是使用

    unique_ptr.

  • (D)按r值計(jì)算:

    如果一個(gè)函數(shù)可以或不聲明所有權(quán)(取決于內(nèi)部代碼路徑),那么請(qǐng)通過(guò)

    &&

    ..但我強(qiáng)烈建議不要在可能的情況下這樣做。

如何操作UNIQUE_PTR

您不能復(fù)制unique_ptr..你只能移動(dòng)它。正確的方法是使用std::move標(biāo)準(zhǔn)圖書館功能。

如果你unique_ptr從價(jià)值上說(shuō),你可以自由地離開(kāi)它。但實(shí)際上并不是因?yàn)?/trans>std::move..采取以下聲明:

std::unique_ptr<Base> newPtr(std::move(oldPtr));

這實(shí)際上是兩種說(shuō)法:

std::unique_ptr<Base> &&temporary = std::move(oldPtr);std::unique_ptr<Base> newPtr(temporary);

(注意:上面的代碼沒(méi)有技術(shù)上的編譯,因?yàn)榉桥R時(shí)的r值引用實(shí)際上不是r值.)它在這里只是為了演示的目的)。

這個(gè)temporary的r值引用。oldPtr..它在構(gòu)造器newPtr運(yùn)動(dòng)發(fā)生的地方。unique_ptr的移動(dòng)構(gòu)造函數(shù)(接受&&對(duì)自己來(lái)說(shuō))是什么實(shí)際的運(yùn)動(dòng)。

如果你有unique_ptr如果你想把它藏在某個(gè)地方,你使用std::move去做儲(chǔ)藏室。


查看完整回答
反對(duì) 回復(fù) 2019-07-03
?
ITMISS

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

是的,如果你拿了unique_ptr構(gòu)造函數(shù)中的值。解釋是件好事。自unique_ptr不可復(fù)制(私有副本ctor),您所寫的應(yīng)該會(huì)給您一個(gè)編譯器錯(cuò)誤。


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

添加回答

舉報(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)