C++中移動(dòng)構(gòu)造函數(shù)為什么需要加noexcept

noexcept關(guān)鍵字修飾的函數(shù)不會(huì)在執(zhí)行過(guò)程中拋出異常。如果標(biāo)記為noexcept的函數(shù)拋出異常,那么編譯器會(huì)調(diào)用std::terminate()函數(shù)中斷程序執(zhí)行。

1.void func() noexcept;

2.為noexcept額外提供一個(gè)常量表達(dá)式作為其參數(shù),true函數(shù)被標(biāo)記為不拋出異常

? constexpr bool suppressExcept = true;

? void fun() noexcept (suppressExcept);

C++11類結(jié)構(gòu)隱式自動(dòng)聲明的和程序員主動(dòng)聲明的不帶任何修飾符的函數(shù)都是默認(rèn)noexcept(true)的

移動(dòng)構(gòu)造函數(shù)可以在對(duì)象進(jìn)行賦值的時(shí)候直接移動(dòng)原對(duì)象已經(jīng)分配好的資源,從而省去重新分配內(nèi)存再拷貝的過(guò)程。STL中多數(shù)容器resizing的時(shí)候調(diào)用容器元素的移動(dòng)構(gòu)造函數(shù)來(lái)移動(dòng)資源。

_VSTD::move_if_noexcept()

為了保證容器類型數(shù)據(jù)的安全,多數(shù)情況下指揮調(diào)用被標(biāo)記為noexcept的移動(dòng)構(gòu)造函數(shù),否則會(huì)調(diào)用拷貝構(gòu)造函數(shù)。因?yàn)?,資源的移動(dòng)過(guò)程中如果拋出異常,那么正在被處理的原始對(duì)象數(shù)據(jù)可能會(huì)因?yàn)楫惓6鴣G失,如果是拷貝構(gòu)造函數(shù),對(duì)資源進(jìn)行拷貝而不對(duì)原始數(shù)據(jù)進(jìn)行更改,無(wú)論是否拋出異常,都不會(huì)影響數(shù)據(jù)的正確性。

可以用于檢測(cè)類的各種構(gòu)造函數(shù)狀態(tài):

cout << boolalpha

<< is_move_constructible<classA>::value << endl //是否可以被移動(dòng)構(gòu)造

<< is_trivially_move_constructible<classA>::value << endl //是否具有普通的移動(dòng)構(gòu)造函數(shù),“普通”的約束條件沒(méi)有虛函數(shù)、沒(méi)有虛基類、沒(méi)有任何不穩(wěn)定的非靜態(tài)成員

<< is_nothrow_move_constructible<classA>::value << endl //是否具有不會(huì)拋出異常的移動(dòng)構(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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