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ù)