2016-08-02 28 views
5

wirKann der Compiler die noexcept'ness einer Funktion entscheiden?

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

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

eindeutig ein Beispiel tun, ist die Funktion void X::add (int) nie jede Ausnahme werfen.

Meine Frage ist, kann der Compiler den Code analysieren und entscheiden, keinen Maschinencode zu generieren, um Ausnahmen zu behandeln, auch wenn die Funktion nicht als noexcept markiert ist?

+0

Ich bin neugierig, warum willst du das (wissen)? – Randy

+1

Haben Sie * den von Ihrem Compiler erzeugten Code * überprüft? –

+2

Es * kann *, genau wie es * kann * sagen, ob eine Funktion "const" oder nicht oder "constexpr" ist. Es ist immerhin ein Compiler. Ob es das tatsächlich tut und ob es diese Information benutzt, ist eine andere Frage. –

Antwort

6

Wenn der Compiler beweisen kann, dass eine Funktion niemals werfen wird, ist es durch die "Als-Wenn" -Regel (§1.9, "Programmausführung" des C++ - Standards) möglich, den Code für Ausnahmen zu entfernen.

Es ist jedoch nicht möglich zu entscheiden, ob eine Funktion niemals im allgemeinen werfen wird, da dies zur Lösung des Halteproblems führt.