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

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

為什么在這種情況下不調(diào)用復(fù)制構(gòu)造函數(shù)?

為什么在這種情況下不調(diào)用復(fù)制構(gòu)造函數(shù)?

C++
猛跑小豬 2019-07-17 18:41:23
為什么在這種情況下不調(diào)用復(fù)制構(gòu)造函數(shù)?下面是代碼片段:class A{public:     A(int value) : value_(value)     {         cout <<"Regular constructor" <<endl;     }     A(const A& other)   : value_(other.value_)       {         cout <<"Copy constructor" <<endl;     }private:     int value_;};int main(){     A a = A(5);}我假設(shè)輸出將是“常規(guī)構(gòu)造器”(對(duì)于RHS),其次是LHS的“復(fù)制構(gòu)造函數(shù)”。因此,我避免了這種樣式,并且總是將類的變量聲明為A a(5);..但令我驚訝的是,在上面的代碼中,從來沒有調(diào)用過復(fù)制構(gòu)造函數(shù)(Visualc+2008)。有沒有人知道這種行為是編譯器優(yōu)化的結(jié)果,還是C+的一些有文檔的(和可移植的)特性的結(jié)果?謝謝。
查看完整描述

3 回答

?
回首憶惘然

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

我研究這個(gè)問題是為了回答另一個(gè)問題,這個(gè)問題是以欺騙的形式結(jié)束的,所以為了不讓工作白費(fèi),我會(huì)回答這個(gè)問題。

表格的陳述A a = A(5)被稱為復(fù)制初始化變量的a..8.5/16的C+11標(biāo)準(zhǔn)規(guī)定:

使用初始化器表達(dá)式作為參數(shù)調(diào)用所選函數(shù);如果函數(shù)是構(gòu)造函數(shù),則調(diào)用初始化目標(biāo)類型的cv非限定版本的臨時(shí)函數(shù)。臨時(shí)值是一個(gè)prvalue。然后,根據(jù)上述規(guī)則,調(diào)用的結(jié)果(是構(gòu)造函數(shù)用例的臨時(shí)結(jié)果)被用于引導(dǎo)初始化副本初始化的目標(biāo)對(duì)象。在某些情況下,允許實(shí)現(xiàn)通過將中間結(jié)果直接構(gòu)造到被初始化的對(duì)象來消除這種直接初始化過程中固有的復(fù)制;參見12.2,12.8。.

這意味著編譯器查找要處理的適當(dāng)構(gòu)造函數(shù)。A(5),創(chuàng)建一個(gè)臨時(shí)的,并將該臨時(shí)副本復(fù)制到a..但是,在什么情況下,復(fù)制可以被刪除呢?

讓我們看看12.8/31是怎么說的:

當(dāng)滿足某些條件時(shí),即使對(duì)象的復(fù)制/移動(dòng)構(gòu)造函數(shù)和/或析構(gòu)函數(shù)有副作用,也允許實(shí)現(xiàn)省略類對(duì)象的復(fù)制/移動(dòng)構(gòu)造。在這種情況下,實(shí)現(xiàn)將省略的復(fù)制/移動(dòng)操作的源和目標(biāo)視為引用同一對(duì)象的兩種不同方式,并且該對(duì)象的銷毀發(fā)生在如果不進(jìn)行優(yōu)化就會(huì)銷毀這兩個(gè)對(duì)象的晚些時(shí)候。復(fù)制/移動(dòng)操作的簡化,稱為復(fù)制省略,允許在下列情況下(可合并以消除多份副本):

[...]

  • 當(dāng)沒有綁定到引用(12.2)的臨時(shí)類對(duì)象被復(fù)制/移動(dòng)到具有相同cv-非限定類型的類對(duì)象時(shí)

    ,可以通過將臨時(shí)對(duì)象直接構(gòu)造到省略的復(fù)制/移動(dòng)的目標(biāo)中來省略復(fù)制/移動(dòng)操作。

考慮到所有這些,下面是表達(dá)式的結(jié)果A a = A(5):

  1. 編譯器會(huì)看到帶有復(fù)制初始化的聲明。
  2. 這個(gè)

    A(int)

    構(gòu)造函數(shù)以初始化臨時(shí)對(duì)象。
  3. 因?yàn)榕R時(shí)對(duì)象是

    綁定到引用,并且它確實(shí)具有相同的類型。

    A

    作為復(fù)制初始化表達(dá)式中的目標(biāo)類型,編譯器可以直接將對(duì)象構(gòu)造為

    a

    ,臨時(shí)的


查看完整回答
反對(duì) 回復(fù) 2019-07-17
?
慕勒3428872

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

A a = A(5);

這一行相當(dāng)于

A a(5);

盡管它的功能樣式外觀,第一行簡單地構(gòu)造a與論點(diǎn)5。不涉及抄襲或臨時(shí)人員。來自C+標(biāo)準(zhǔn)的第12.1.11節(jié):

函數(shù)符號(hào)類型轉(zhuǎn)換(5.2.3)可用于創(chuàng)建其類型的新對(duì)象。[注意:語法看起來像構(gòu)造函數(shù)的顯式調(diào)用。-尾注]


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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