C++11新特性(51)- 移動建構函式通常應該是noexcept
阿新 • • 發佈:2019-02-07
不會丟擲異常的移動建構函式
拷貝建構函式通常伴隨著記憶體分配操作,因此很可能會丟擲異常;移動建構函式一般是移動記憶體的所有權,所以一般不會丟擲異常。
C++11中新引入了一個noexcept關鍵字,用來向程式設計師,編譯器來表明這種情況。
noexcept函式
對於永遠不會丟擲異常的函式,可以宣告為noexcept的。這一方面有助於程式設計師推斷程式邏輯,另一方面編譯器可以更好地優化程式碼。
為了說明這個效果我們將Tracer類稍作修改。
分別在拷貝建構函式和移動建構函式(noexcept)中實際上丟擲異常看看程式的反應。
沒有宣告noexcept的情況
首先是沒有宣告為noexcept的拷貝建構函式。
try處理中呼叫了拷貝建構函式,輸出結果如下:
異常被正常捕捉。
聲明瞭noexcept函式的情況
try處理中呼叫了宣告為noexcept的移動建構函式,輸出結果如下:
同樣的try/catch構造已經不能捕捉移動建構函式丟擲的異常從而導致程式終止。這說明noexcept影響了編譯器生成的程式碼。
作者觀點
生成高效程式碼的另一個側面就是功能的缺失,高階的東西有時候可能是雙刃劍,要理解了才能用好。
覺得本文有幫助?請分享給更多人。
閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】