Was fehlt in C++11?



  • wxSkip schrieb:

    Hier wird's schon schwieriger

    operator double, double() const
    {
      return rand()%2==0 ? this->X : this->Y : this->Y : this->X;
    }
    
    operator double, double() const
    {
      return std::rand() % 2 == 0 ? (this->X : this->Y) : (this->Y : this->X);
    }
    


  • EOutOfResources schrieb:

    wxSkip schrieb:

    Hier wird's schon schwieriger

    operator double, double() const
    {
      return rand()%2==0 ? this->X : this->Y : this->Y : this->X;
    }
    
    operator double, double() const
    {
      return std::rand() % 2 == 0 ? (this->X : this->Y) : (this->Y : this->X);
    }
    

    Und was gibst du für eine Fehlermeldung aus, wenn der Benutzer das nicht klammert?

    error: no difference in operator predence for two different operations. Please put parentheses around the operations.
    


  • wxSkip schrieb:

    Und was gibst du für eine Fehlermeldung aus, wenn der Benutzer das nicht klammert?

    Gar keine. Schlechte Formatierung ist Sache des Users. Der Compiler kennt ja die Anzahl der Rückgabewerte. Daraus sollte er es schon ableiten können.



  • Das schwierige für den Compiler wäre, dass die Argumentzahl plötzlich veränderlich wäre. Das bedürfte mindestens einer radikalen Neuimplementierung zahlreicher Compilerteile, wenn es überhaupt möglich wäre mit überladbaren Funktionen usw. Und das lohnt sich m.E. wirklich nicht im Verhältnis zum Nutzen.



  • Viele Möglichkeiten.
    Zur Zeit ist zum Beispiel das geklammerte Plus noch frei.

    operator double (+) double() const
    {
      return this->X (+) this->Y;
    }
    

    Oder als echte Traditionalisten geben wir dem Schlüsselwort static eine weitere Bedeutung.

    operator double static double() const
    {
      return this->X static this->Y;
    }
    

    Aber mit {}-Codesequenzen innerhalb von Ausdrücken, wäre es angebracht, die Operatoren ?: und , abzuschaffen. Nur geht das nicht wegen der Abwärtskompatibilität. C++ muß geforkt werden. Ich schlage als neuen Namen #C++-. Das - soll ausdrücken, daß mache Sachen unter Aufgabe der Abwärtskompatimilität weggemacht werden und das # soll ausdrücken, daß sie total modern ist.



  • Und an {} innerhalb eines Ausdrucks ist auch schon klar genug gemacht, daß jetzt Code kommt.

    sort(vec,{l.z<r.z;});

    Gäbe das nicht ein Problem mit Initialisierungslisten? Schließlich könnte eine Funktion ja auch eine Überladung haben, die als zweiten Parameter ein Objekt übergeben bekommt, das mittels einer std::initializer_list konstruiert wird.



  • Irgendwer schrieb:

    Und an {} innerhalb eines Ausdrucks ist auch schon klar genug gemacht, daß jetzt Code kommt.

    sort(vec,{l.z<r.z;});

    Gäbe das nicht ein Problem mit Initialisierungslisten? Schließlich könnte eine Funktion ja auch eine Überladung haben, die als zweiten Parameter ein Objekt übergeben bekommt, das mittels einer std::initializer_list konstruiert wird.

    Solcherlei Probleme hat man in C++ dauernd, und das zeigt nicht nur, dass die Sprache alt ist sondern auch, dass sie syntaxmäßig viel zu alt ist. Alleine auch schon der Mehraufwand um für C++ IDE-Features wie Refactoring umzusetzen ist erheblich höher als bei modernen Sprachen (im Sinne der Syntax) wie Java oder C#.

    MfG SideWinder



  • volkard schrieb:

    #C++-.

    Damit ist aber der Gag im Namen weg. Ich wäre für C#er++ 😃



  • Bin ich der einzige, der solche Container vermisst? 😮



  • SideWinder schrieb:

    Alleine auch schon der Mehraufwand um für C++ IDE-Features wie Refactoring umzusetzen ist erheblich höher als bei modernen Sprachen (im Sinne der Syntax) wie Java oder C#.

    Das liegt aber eher daran, dass die Sprache semantisch viel komplexer ist, oder? Alleine schon die ganzen Templates (welche einen grossen Teil der Standardbibliothek ausmachen), die Trennung von Deklaration und Definition, Zeiger, Referenzen, const , ... Syntaktisch ist C++ recht ähnlich wie Java oder C#, zumindest wenn man "ganz normal" (ohne Metaprogrammierung etc.) programmiert.

    Ich finde es langsam Zeit für Pointer-Container, auch wenn mir Boosts Umsetzung nicht wahnsinnig gefällt. Es gibt zwar jetzt unique_ptr , aber damit hat man keine Kopiersemantik.



  • Echte eingebaute Tupel wären toll. Nur welche Klammern soll man dafür nehmen?

    volkard schrieb:

    #C++-

    Man müsste eine Art neues C++ schaffen, das per Compiler einfach zu C++0x konvertiert wird. Sachen wie R-Value-Referenzen sind imo zu "intern", das sollte automatisch gemacht werden.



  • fdfdg schrieb:

    Sachen wie R-Value-Referenzen sind imo zu "intern", das sollte automatisch gemacht werden.

    C++11 hat implizite Move-Semantik, in einigen Fällen mit unnötigen Kopien kann automatisch der Move-Konstruktor aufgerufen werden. Und der Move-Konstruktor kann wiederum automatisch vom Compiler generiert werden.



  • volkard schrieb:

    Statische Destruktoren? Erkläre mal. Ist das, wenn man vor den Destruktor nicht virtual schreibt?
    Statische Konstruktoren? Erkläre mal. Ist das, wenn man ein Objekt erzeugen will, dessen Typ man zur Compilezeit kennt?

    ipsec schrieb:

    Ich glaube er meint damit ein ähnliches Konzept wie in C#: der statische Konstruktor jeder Klasse wird zum Programmbeginn aufgerufen (seine Aufgabe ist, statische Member der Klasse zu initialisieren), entsprechend räumt der Destruktor am Ende des Programms die statischen Member wieder auf.

    Wie ipsec schon geschrieben hat, möchte ich wie in C# die Möglichkeit haben statische Konstruktoren bzw. Destructoren zu verwenden. Ne gescheite (evtl. optionale) RTTI implementierung wäre auch nicht verkehrt. Damit wäre C++ perfekt für mich. Aber angeblich lässt sich ja beides nicht mit C++ umsetzen. Vielleicht will man aber auch einfach nicht. Sehr schade.



  • Ich seh nicht warum man in C++ statische Konstruktoren brauchen würde, das Problem das in C# damit gelöst wird gibts in C++ doch nicht!?



  • Ich sehe nicht, dass die RTTI-Möglichkeiten in C++ nicht "gescheit" sind.



  • @StellerFragen: Vielleicht willst du so etwas? (ist halt nur ein Nachbau, ungetestet)

    //MyClass.h
    
    class MyClass
    {
        class StaticRAII
        {
            public:
            Initializer()
            {
                MyClass::res.request();
            }
            ~Initializer()
            {
                MyClass::res.release();
            }
        };
        static resource res;
    };
    
    //MyClass.cpp
    MyClass::StaticRAII MyClass_static_raii;
    


  • ipsec schrieb:

    Ich sehe nicht, dass die RTTI-Möglichkeiten in C++ nicht "gescheit" sind.

    Das sehe ich schon.
    Aber sobald man sich

    if(Derived* d=dynamic_cast<Derived>(base))
       d->flyLikeADerived();
    

    und

    if(typeid(base)==typeid(Derived))
       static_cast<Derived*>(base)->flyLikeADerived();
    

    abgewöhnt hat, braucht man RTTI nur noch unglaublich selten.



  • Ich denk sowas sollte man sich besser garnicht angewöhnen :p

    Abgesehen davon verwendest du da oben doch RTTI!?



  • dot schrieb:

    Abgesehen davon verwendest du da oben doch RTTI!?

    Ja, in der Anfänger-Parodie. Selber nehme ich natürlich den Profitrick mit dem Wort virtual.



  • Interessant, dass noch niemand Reflection und Garbage Collector erwähnt hat... Wäre wohl anders, wenn dieses Thema in Rund um die Programmierung eröffnet worden wäre 😉


Anmelden zum Antworten