<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # noexcept – 阻止異常的傳播與擴散 如果一個函數不能拋出異常,或者一個程序并沒有接獲某個函數所拋出的異常并進行處理,那么這個函數可以用新的noexcept關鍵字對其進行修飾,表示這個函數不會拋出異常或者拋出的異常不會被接獲并處理。例如: ``` extern "C" double sqrt(double) noexcept; // 永遠不會拋出異常 vector my_computation(const vector& v) noexcept // 在這里,我不準備處理內存耗盡的異常,所以我只是簡單地將函數聲明為noexcept { vector res(v.size()); // 可能會拋出異常 for(int i; i return res; } ``` 如果一個經過noexcept修飾的函數拋出異常(異常會嘗試逃出這個函數(?)),程序會通過調用terminate()來結束執行。通過 terminate()的調用來結束程序的執行會帶來很多問題,例如,無法保證對象的析構函數的正常調用,無法保證棧的自動釋放,同時也無法在沒有遇到任 何問題的情況下重新啟動程序。所以,它是不可靠的。 我們這樣寫是故意的,它使得成為一種簡單、粗暴但是非常有效的機制(比那種舊的動態地拋出異常的機制要有效得多)。 同時,我們還可以讓一個函數根據不同的條件實現noexcept修飾或者是無noexcept修飾。例如,一個算法可以根據它用作模板參數所使用的操作是否拋出異常,來決定自己是否拋出異常。例如: ``` template void do_f(vector& v) noexcept(noexcept(f(v.at(0)))); //如果f(v.at(0))可以拋出異常,則這個函數也可以拋出異常 { for(int i; i v.at(i) = f(v.at(i)); } ``` 在這里,第一個noexcept被用作操作符(operator):如果if f(v.at(0))不能夠拋出異常,noexcept(f(v.at(0)))則返回true,也即意味著f()和at()是無法拋出異常(noexcept)。 noexcept()操作符是一個常量表達式,并且不計算表達式的值,只是判斷這個表達式是否會產生并拋出異常。 聲明的通常形式是noexcept(expression),并且單獨的一個“noexcept”關鍵字實際上就是的一個noexcept(true)的簡化。一個函數的所有聲明都必須與noexcept聲明保持 兼容。 一個析構函數不應該拋出異常;通常,如果一個類的所有成員都擁有noexcept修飾的析構函數,那么這個類的析構函數就自動地隱式地noexcept聲明,而與函數體內的代碼沒有關系。 通常,將某個拋出的異常進行移動操作是一個很壞的主意,所以,在任何可能的地方都用noexcept進行聲明。如果某個類的所有成員都有使用 noexcept聲明的析構函數,那么這個類默認生成的復制或者移動操作(類的復制構造函數,移動構造函數等)都是隱式的noexcept聲明。(?) noexcept 被廣泛地系統地應用在C++11的標準庫中,以此來提供標準庫的性能和滿足標準庫對于簡潔性的需求。 參考 : + Standard: 15.4 Exception specifications [except.spec]. + Standard: 5.3.7 noexcept operator [expr.unary.noexcept]. + [N3103==10-0093] D. Kohlbrenner, D. Svoboda, and A. Wesie: Security impact of noexcept. (Noexcept must terminate, as it does). + [N3167==10-0157] David Svoboda: Delete operators default to noexcept . + [N3204==10-0194] Jens Maurer: Deducing "noexcept" for destructors + [N3050==10-0040] D. Abrahams, R. Sharoni, and D. Gregor: Allowing Move Constructors to Throw (Rev. 1) .
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看