2016-02-28 44 views
0

關於此功能C++異常,不確定的行爲和noexcept

int test(int a,int b) 
{ 
    return a/b; 
} 

如果我打電話test(2,1),什麼都不會發生。
但是,如果我打電話test(2,0),它會導致未定義的行爲。
因此,我應該將其定義爲noexcept

順便說一句,爲什麼std :: vector :: operator []不是noexcept

+0

第二個問題在這裏問:http://stackoverflow.com/questions/20517259/why-vector-access-operators-are-not-specified-as-noexcept –

+0

@JamesRoot非常感謝! – Caesar

回答

0

我應該將它定義爲noexcept嗎?

你當然可以,如果你想。這是真的,該函數不會拋出異常。但是,它仍然可以通過零除以失敗。

這取決於你認爲noexcept應該是什麼意思。標準庫似乎將它視爲關鍵字,意味着該函數不可能失敗,而不僅僅是它不會拋出。如果你遵循他們的慣例,你不應該使它成爲noexcept。但是,如果你想要noexcept只意味着它不會拋出,那麼你應該。

無論哪種方式,你都應該使用相同的約定。在構造函數和賦值運算符之外,兩種方法都沒有很大的好處。

0

你實際上是以錯誤的方式提出這個問題。使用noexcept的決定通常應該是自上而下的(例如,對你的函數的調用者來說這樣做不是自下而上的(即根據你的函數做什麼)。

指定「不能拋出」與「不需要拋出」之間有區別。 noexcept適用於「絕對不能扔」的情況,而不是「不用扔」。但決定哪個是合適的取決於功能調用者的需求,而不是功能如何實現。

通過離開noexcept,可以提供函數的投擲版本,例如調試目的。在「不需要拋出」類別中的函數可以在調試期間使用拋出版本安全地替換,然後在「發佈」版本中使用非拋出版本。這種檢查在「發佈」版本中是不可取的,因爲它們經常對程序性能指標產生不利影響 - 並且在某些情況下也可能導致不需要的副作用(例如,如果檢查執行類似探測調用堆棧或跟蹤程序)。

這就是原因,operator[]std::vector不是nothrow - 它沒有被指定爲投擲,但有投擲版本替換它可以用於調試目的很有幫助。如果它被指定爲nothrow,那麼它將減少開發人員在發佈之前調試其代碼的機會 - 使用標準庫。