Throw und ternärer Operator in C ++

7

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 ++?

    
fmorency 31.10.2011, 18:00
quelle

4 Antworten

11

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!

    
John Marshall 31.10.2011, 18:08
quelle
4

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.

    
Ben Voigt 31.10.2011 18:05
quelle
3

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.

    
Mooing Duck 31.10.2011 18:10
quelle
1

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%     
lvella 31.10.2011 18:11
quelle

Tags und Links