2016-02-29 89 views
8

當我定義一個constexpr函數時,我是否也應該聲明它爲noexcept?我想在參數和用法滿足編譯時評估要求的情況下,潛在例外的含義是沒有意義的。但是在運行時對函數進行評估的情況下,它將正常應用。`constexpr`函數也應該是`noexcept`嗎?

作爲一個實際問題,如果函數確實是簡單的,也許使用內置算術或轉換,這樣我希望編譯器總是內聯函數並在其中進行優化,對於生成的代碼的效率如果我離開noexcept

回答

7

不,你不應該。

「不能失敗」和「可在編譯時評估」是正交問題。例如,你想寫一個整數冪函數,但是你想把它作爲簽名的權力(因爲你認爲無符號數只能用於非常特殊的情況)。現在你說如果權力是負面的,你想拋出異常。在C++ 14你可以寫這樣的:

constexpr int ipow(int base, int power) { 
    if (power < 0) throw std::domain_error("negative power"); 
    int result = 1; 
    for (int i = 0; i < power; ++i) result *= base; 
    return result; 
} 

顯然,此功能不可noexcept,但對於非負參數,你明明可以在編譯時進行評估。如果您在編譯時需要結果的上下文中嘗試使用負面參數,則會出現編譯錯誤,這應該很好。

相關問題