Der folgende Code wird mit G ++ 4.6.1 kompiliert, aber nicht mit Visual Studio 2008
%Vor%Tatsache ist, dass der Visual Studio Compiler einen internen Absturz ausführt.
Ich möchte wissen, ob das Standard-C ++ ist und warum es nicht mit Visual Studio kompiliert, aber mit G ++?
Es ist Standard C ++. Entweder (oder beide) der then / else-Ausdrücke in einem Bedingungsausdruck dürfen stattdessen ein throw-Ausdruck sein (C ++ 98 5.16 / 2).
Wenn Visual Studio beim Kompilieren abstürzt ... würde das schade sein!
Comeau kompiliert es ohne Fehler (hier ist mein minimaler kompilierbarer Testfall):
%Vor%Das ist ein ziemlich guter Beweis dafür, dass es nach dem Standard erlaubt ist. So ist die Tatsache, dass MSVC abstürzt, anstatt sauber mit einem Fehler zu versagen.
Auch scheint es in VC ++ 2010
behoben zu sein %Vor%und x64-Version:
%Vor%Aktualisieren Sie Ihren Compiler wenn möglich, das ist bei weitem nicht der einzige Fehler, der 2010 behoben wurde.
Aus dem C ++ 11. Februar Entwurf
§ 5.16 / 2 Wenn entweder der zweite oder der dritte Operand void ist (möglicherweise cv-qualifiziert), dann werden der Wert lvalue-to-rvalue (4.1), Array-to-Pointer (4.2) und function-to für den zweiten und dritten Operanden werden Standardkonvertierungen des Zeigers (4.3) durchgeführt, und eine der folgenden Angaben muss lauten:
- Der zweite oder der dritte Operand (aber nicht beide) ist ein throw-Ausdruck (15.1); das Ergebnis ist vom Typ des anderen und ist ein Prvalue.
- Sowohl der zweite als auch der dritte Operand haben den Typ void; Das Ergebnis hat den Typ void und ist ein Prvalue. [Hinweis: Dies schließt den Fall ein, dass beide Operanden throw-Ausdrücke sind. -Hinweis]
Es scheint, dass throw
als Bewertung für void
zählt und dass dies erlaubt ist.
Der interne Absturz kann als Fehler von Visual Studio betrachtet werden. Ein Compiler sollte niemals wegen des kompilierten Codes abstürzen.
Dies ist eine sehr seltsame Verwendung des ternären Operators, eine einfache, wenn vor der Rückkehr ein viel vorzuziehendes Idiom wäre:
%Vor%Tags und Links c++ operators ternary-operator