int test(int a,int b)
{
return a/b;
}
如果我打電話test(2,1)
,什麼都不會發生。
但是,如果我打電話test(2,0)
,它會導致未定義的行爲。
因此,我應該將其定義爲noexcept
?
順便說一句,爲什麼std :: vector :: operator []不是noexcept
?
int test(int a,int b)
{
return a/b;
}
如果我打電話test(2,1)
,什麼都不會發生。
但是,如果我打電話test(2,0)
,它會導致未定義的行爲。
因此,我應該將其定義爲noexcept
?
順便說一句,爲什麼std :: vector :: operator []不是noexcept
?
我應該將它定義爲
noexcept
嗎?
你當然可以,如果你想。這是真的,該函數不會拋出異常。但是,它仍然可以通過零除以失敗。
這取決於你認爲noexcept
應該是什麼意思。標準庫似乎將它視爲關鍵字,意味着該函數不可能失敗,而不僅僅是它不會拋出。如果你遵循他們的慣例,你不應該使它成爲noexcept
。但是,如果你想要noexcept
只意味着它不會拋出,那麼你應該。
無論哪種方式,你都應該使用相同的約定。在構造函數和賦值運算符之外,兩種方法都沒有很大的好處。
你實際上是以錯誤的方式提出這個問題。使用noexcept
的決定通常應該是自上而下的(例如,對你的函數的調用者來說這樣做不是自下而上的(即根據你的函數做什麼)。
指定「不能拋出」與「不需要拋出」之間有區別。 noexcept
適用於「絕對不能扔」的情況,而不是「不用扔」。但決定哪個是合適的取決於功能調用者的需求,而不是功能如何實現。
通過離開noexcept
,可以提供函數的投擲版本,例如調試目的。在「不需要拋出」類別中的函數可以在調試期間使用拋出版本安全地替換,然後在「發佈」版本中使用非拋出版本。這種檢查在「發佈」版本中是不可取的,因爲它們經常對程序性能指標產生不利影響 - 並且在某些情況下也可能導致不需要的副作用(例如,如果檢查執行類似探測調用堆棧或跟蹤程序)。
這就是原因,operator[]
爲std::vector
不是nothrow
- 它沒有被指定爲投擲,但有投擲版本替換它可以用於調試目的很有幫助。如果它被指定爲nothrow
,那麼它將減少開發人員在發佈之前調試其代碼的機會 - 使用標準庫。
第二個問題在這裏問:http://stackoverflow.com/questions/20517259/why-vector-access-operators-are-not-specified-as-noexcept –
@JamesRoot非常感謝! – Caesar