Sie erhalten einen Fehler in der Zeile, in der die Teilung erfolgt ist: "Fehler C2124: teile oder modiere durch Null"
was lahm ist, weil es ebenso unvermeidlich ist, dass die 'if' Prüfung fehlschlägt, da es die Division zu einem div durch 0 führt. Offen gesagt sehe ich keinen Grund für den Compiler, überhaupt irgendwas in der "wenn", außer um die Integrität der Zahnspange zu gewährleisten.
Wie auch immer, offensichtlich ist dieses Beispiel nicht mein Problem, mein Problem kommt, wenn ich komplizierte Template-Sachen mache, um so viel wie möglich zur Kompilierzeit zu machen, in einigen Fällen können die Argumente 0 sein.
gibt es trotzdem, um diesen Fehler zu beheben? oder deaktivieren Sie es? oder eine bessere Umgehungslösung als das:
Momentan ist die einzige Arbeit, die ich mir vorstellen kann (was ich schon einmal gemacht habe, als ich das gleiche Problem mit rekursivem enum-Zugriff hatte), die Template-Spezialisierung für das 'if' zu verwenden.
Oh ja, ich benutze Visual Studio Professional 2005 SP1 mit dem vista / win7 Fix.
Ich nehme an, Ihr Compiler versucht, das Code-Snippet zu optimieren, da bob
const
definiert ist, so dass der Anfangswert von fred
zur Kompilierzeit bestimmt werden kann. Vielleicht können Sie diese Optimierung verhindern, indem Sie bob non-const deklarieren oder das Schlüsselwort volatile
verwenden.
Das Problem - und der Compiler hat dabei keine Wahl - ist, dass bob
wie auch 6 ein Integral Constant Expression ist. Daher ist 6 / bob auch ein ICE, und muss ausgewertet werden zur Kompilierzeit.
Es gibt eine sehr einfache Lösung: inline int FredFromBob(int bob) { return 6/bob; }
- ein Funktionsaufruf-Ausdruck ist niemals ein ICE, selbst wenn die Funktion trivial ist und inline deklariert wird.
Tags und Links c++ visual-c++ compiler-construction