Bringt das was?



  • Folgendes hab ich heute in einem Sourcecode gesehen (minimalbeispiel):

    class Error {};
    
    class A {
        int value;
    
    public:
        A (int i) throw(Error) : value(i==0?(throw Error(),0):i) {}
    };
    

    frage: siehe topic



  • tolle fragestellung. was ist denn mit "bringt" jetzt genau gemeint?



  • Hallo,
    wo genau ist das Problem?

    A (int i) throw(Error)

    Exceptionspezifikation. Bringt nur Ärger und sollte man nicht unbedingt verwenden.

    value(i==0?(throw Error(),0):i) {}

    Workaround für blöde Compiler.
    Die beiden Werte nach dem ? beim ternären Operator müssen die ähnliche Typen haben (mal ganz grob gesagt). Als Ausnhame ist aber auch eine throw-Anweisung erlaubt. Diese Ausnahme beherrschen manche Compiler aber nicht.
    Deshalb das ,0. Der linke Ausdruck (das throw) wird zuerst ausgewertet, das Ergebnis des Gesamtausdrucks ist aber der rechte Operand, als int und das ist kompatibel zu i.



  • ok, also wenn der compiler es kann geht auch ohne ,0
    ok, fragestellung wäre vielleicht besser gewesen: ist ,0 notwendig 🙂
    dnk


Anmelden zum Antworten