2016-08-02 3 views
5

はのは、たとえばコンパイラは関数のnoexcept'nessを決定できますか?

class X 
{ 
    int value; 
public: 
    X (int def = 0) : value (def) {} 

    void add (int i) 
    { 
     value += i; 
    } 
}; 

明らかに、機能void X::add (int)は任意の例外をスローすることはありませんがやってみましょう。

私の質問は、コンパイラがコードを分析し、関数がnoexceptとしてマークされていなくても、例外を処理するマシンコードを生成しないことを決定できますか?

+0

私は興味があります、なぜあなたはこれを知りたいですか? – Randy

+1

コンパイラによって生成されたコードをチェックしましたか? –

+2

関数は 'const'か' constexpr'かどうかを知ることができます。結局コンパイラだ。それが本当に*しているのか、それを使うのか*という情報は別の質問です。 –

答えて

6

コンパイラが関数が投げられないことを証明できれば、 "As-If"ルール(C++標準の§1.9「プログラム実行」)によって例外を処理するコードを削除することができます。

しかし、関数が一般的にのをスローしないかどうかを判断することはできません。なぜなら、これは停止問題を解決することになります。

関連する問題