C++編譯器選擇是否自動(dòng)生成代碼的背后邏輯

編譯器會(huì)為class和struct(實(shí)際上兩者在C++中是一回事)自動(dòng)生成構(gòu)造函數(shù)、賦值操作符函數(shù)和析構(gòu)函數(shù)。如果不是這樣,那么開(kāi)發(fā)者就必須自己寫(xiě)一些枯燥冗余的代碼。然而編譯器并不總是生成這些默認(rèn)代碼,當(dāng)它覺(jué)得它無(wú)法生成正確的代碼時(shí),它就會(huì)拒絕生成默認(rèn)代碼。在以下幾種情況中,編譯器會(huì)認(rèn)為它無(wú)法生成正確的代碼:

  1. 當(dāng)開(kāi)發(fā)者自己定義了構(gòu)造函數(shù)時(shí)

    編譯器會(huì)認(rèn)為開(kāi)發(fā)者想要自己定義默認(rèn)構(gòu)造函數(shù)(即無(wú)參數(shù)的構(gòu)造函數(shù)),它無(wú)法猜測(cè)開(kāi)發(fā)者的想法,因此不會(huì)再自動(dòng)生成默認(rèn)構(gòu)造函數(shù)。

  2. 當(dāng)開(kāi)發(fā)者自己定義了移動(dòng)構(gòu)造函數(shù)時(shí)

    編譯器認(rèn)為開(kāi)發(fā)者可能希望僅使用移動(dòng)語(yǔ)義而禁止拷貝,所以拷貝構(gòu)造和拷貝賦值都不再自動(dòng)生成。移動(dòng)賦值也不會(huì)自動(dòng)生成,而是交給開(kāi)發(fā)者自己來(lái)定義,因?yàn)殚_(kāi)發(fā)者已經(jīng)在定義移動(dòng)語(yǔ)義了。

  3. 當(dāng)開(kāi)發(fā)者自己定義了移動(dòng)賦值操作函數(shù)時(shí)

    同上原因,拷貝構(gòu)造和拷貝賦值不再默認(rèn)生成。同樣的原因,移動(dòng)構(gòu)造函數(shù)也不會(huì)自動(dòng)生成。

  4. 當(dāng)開(kāi)發(fā)者自己定義了拷貝構(gòu)造函數(shù)

    編譯器認(rèn)為開(kāi)發(fā)者已經(jīng)自己定義了拷貝語(yǔ)義,無(wú)法保證能自動(dòng)生成正確的移動(dòng)語(yǔ)義的代碼,所以不再自動(dòng)生成此類代碼。C++11標(biāo)準(zhǔn)規(guī)定也不要自動(dòng)生成拷貝賦值操作符函數(shù)代碼,因?yàn)橛脩艚庸芰丝截愓Z(yǔ)義的定義,但是Visual Studio仍然會(huì)生成拷貝賦值操作符函數(shù)代碼。

  5. 當(dāng)開(kāi)發(fā)者自己定義了拷貝賦值操作函數(shù)時(shí)

    同上原因,不再生成移動(dòng)語(yǔ)義的代碼。C++11標(biāo)準(zhǔn)規(guī)定也不要自動(dòng)生成拷貝構(gòu)造函數(shù)代碼,因?yàn)橛脩艚庸芰丝截愓Z(yǔ)義的定義,但是Visual Studio仍然會(huì)生成拷貝構(gòu)造函數(shù)代碼。

  6. 當(dāng)開(kāi)發(fā)者自己定義了析構(gòu)函數(shù)時(shí)

    移動(dòng)構(gòu)造和移動(dòng)賦值都涉及到資源從源對(duì)象移動(dòng)到目標(biāo)對(duì)象,對(duì)于源對(duì)象來(lái)說(shuō)是釋放了對(duì)資源的所有權(quán)。而析構(gòu)函數(shù)是釋放資源,所以既然用戶自己定義了用于釋放資源目的的析構(gòu)函數(shù),那么說(shuō)明移動(dòng)的語(yǔ)義無(wú)法保持默認(rèn)的實(shí)現(xiàn),因此編譯器不再自動(dòng)生成移動(dòng)語(yǔ)義的代碼。

  7. 當(dāng)開(kāi)發(fā)者自己定義了虛析構(gòu)函數(shù)時(shí)

    編譯器不再自動(dòng)生成默認(rèn)析構(gòu)函數(shù)代碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容