2016-02-29 3 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ではなく、非負の引数のために、あなたは明らかにコンパイル時に、それを評価することができます。コンパイル時に結果が必要なコンテキストで負の引数を試すとコンパイルエラーが発生しますが、これは問題ありません。

関連する問題