Auswertungsreihenfolge


  • Mod

    loooool schrieb:

    decimad schrieb:

    @loooool: Aber das ist doch jetzt wieder ein Aufruf eines Konstruktors mit der Eigenschafft, dass die Auswerungsreihenfolge der Argumente nicht spezifiziert ist?

    Wenn der Konstruktor mit {} aufgerufen wird, ist die Auswertungsreihenfolge spezifiziert, sonst nicht. (Find ich total inkonsistent.)

    gcc setzt das allerdings bis jetzt nicht um.


  • Mod

    Auch wenn ich VC++ jetzt ganz klar die Schuld dafür gebe

    Du versuchst so etwas mit VC++ umzusetzen!?

    gcc setzt das allerdings bis jetzt nicht um.

    Ja, leider, selbst der neueste nicht:

    #include <iostream>
    
    struct A
    {
    	template<typename... Args>
    	A(Args&&...){}
    };
    
    int main()
    {
    	int a = 0;
    	A{++a, a*=2};
    	std::cout << a;
    }
    

    Sollte eigentlich 2 ausgeben, es gibt jedoch 1 aus. Clang macht es richtig.

    out schrieb:

    Arcoth schrieb:

    out schrieb:

    Ist Arcoth = Sone? Wurde er gesperrt?

    Nein, wieso auch? :p Ich habe nur wegen den Wortwitzen den Account gewechselt.

    Marcus kann einen auch umbenennen. Musst nur freundlich fragen.

    Hat er ja auch! Vorher war ich der *. Ich wollte nur Sone nicht umbenennen, da das zu viel Verwirrung bezüglich alten Threads gestiftet hätte.



  • @loooool: VC++ kompiliert das, aber setzt diese Regel genausowenig um 😞



  • Hoffentlich kommt D irgendwann in Schwung, es wird Zeit! Im Moment frickeln sie ja noch an den Allokatoren und anderen grundlegenden Sachen herum, so richtig gesetzt hat sich die Sprache noch nicht.



  • Hab mal in der Bug-Database von Microsoft rumgeschaut, die werden das laut deren Aussage im gesamten VS 2013 Produkzyklus nicht ausbessern.


  • Mod

    decimad schrieb:

    Hab mal in der Bug-Database von Microsoft rumgeschaut, die werden das laut deren Aussage im gesamten VS 2013 Produkzyklus nicht ausbessern.

    Und die Variante mit dem Array lässt sich nicht "beheben"? Das false vielleicht an den Anfang setzen? Vielleicht zwei false einfügen?

    Tatsächlich ist es aber ein völlig hirnloses Unterfangen, mit VC++ solche Templates zu verwenden. Das ist eine Totgeburt.

    Edit²: Gut, ich werde dir nicht direkt Clang empfehlen, aber mindestens einen Compiler-Wechsel schon. Mit VC++ wirst du permanent gebremst werden.



  • MS kriegt den 2013er Compiler nicht mehr in den Griff. Zuviel gefrickelt - zu wenig Test-Cases



  • Ich seh' halt nur beide Seiten der Sache. Ja, die Jungs bei Microsoft sind ganz offensichtlich überfordert, nicht zwangsläufig intellektuell, aber mindestens mal an Man-Power. Aber das kommt eben auch dadurch, dass C++ einfach unverhältnismäßig viel Ballast mit sich rumträgt - wovon vieles schlechte Entscheidungen waren, sodass neue Zusätze immer komplizierter daherkommen, als sie für das Problem, das sie lösen sollen, sein müssten. Darunter haben aber nicht nur die Compiler-Entwickler zu leiden, sondern auch die Endanwender der ganzen Sache (zum Beispiel so Leute wie ich, die ohne eure Hilfe alle Paragraphen des Standards auswendig können müssten, um etwas total banales umzusetzen).



  • Ich werde morgen früh beim Kaffee eine halbe Stunde lang versuchen, das irgendwie mit der Array-Sache zum laufen zu bringen, danach gebe ich es auf, ich habe nicht endlos Zeit.

    Wenn ich nicht gerade wegen dieser Entwicklung auf Windows und C++ festgenagelt wäre, genügend Zeit zur Einarbeitung hätte und neu anfangen könnte, dann würde ich nicht nur den Compiler wechseln, sondern auch die Sprache. Oder vielleicht auch die Branche 😉 Aber dazu ist's im Moment ein paar hundert tausend Codezeilen zu spät. 😞



  • decimad schrieb:

    auf Windows und C++ festgenagelt

    Das ist noch erträglich, dann kannst du wenigstens den Compiler wechseln.



  • junge junge dir scheint ja c++ den ganzen sonntag abend versaut zu haben. komm mal runter, lenk dich irgendwie ab



  • Den Abend zerstört hat es auch! Jahrelang wartete ich auf Variadics, weil ich einfach faul bin und mein erstes Anliegen ist, Boilerplate-Code automatisch generieren zu lassen, bei dem ich einfach jedes Mal wieder irgendeinen Fehler begehen würde, weil ich von der Stupidität der Tätigkeit abgelenkt werde. Und nun kommt so ein Rotz dabei heraus 😉

    Egal, meine Erkenntnisse: VC++ erkennt das Array-Konstrukt nicht als Compile-Zeit-Konstante, wahrscheinlich wegen der Runtime-Aufrufe, die da drin stecken. Das wird mit der bezeichnenden Fehlermeldung quittiert, dass leere Initialisierer nicht zugelassen sind, ist ja klar, was sollte man da auch sonst schreiben.

    Mit der Tailrekursion klappts jetzt, ist ja auch eine Spezialität von C++.

    Aber vielen Dank für euer Engagement, es hätte mir unter besseren Umständen selbstverständlich sehr geholfen!


  • Mod

    Egal, meine Erkenntnisse: VC++ erkennt das Array-Konstrukt nicht als Compile-Zeit-Konstante, wahrscheinlich wegen der Runtime-Aufrufe, die da drin stecken.

    Das ist ja auch selbstverständlich. Die Größe steht fest, nicht jedoch die Werte.

    Das wird mit der bezeichnenden Fehlermeldung quittiert, dass leere Initialisierer nicht zugelassen sind, ist ja klar, was sollte man da auch sonst schreiben.

    Gar nichts, denn der Code ist völlig in Ordnung. Und der Initializer ist nie leer.

    Mit der Tailrekursion klappts jetzt, ist ja auch eine Spezialität von C++.

    Nun ja, man kann es natürlich auch herumtricksen.

    Ich rate dir nochmals von deinem Vorhaben ab. VC++ ist dem einfach nicht gewachsen. Da musst du noch Fünf Jahre warten.



  • Jahrelang wartete ich auf Variadics

    Dein Problem hat nichts mit Templates zu tun. Dann mach doch ein rekursives varaidic template, so schlimm ist das nun auch nicht.

    Mit der Tailrekursion klappts jetzt, ist ja auch eine Spezialität von C++.

    Was hat das mit Endrekursion zu tun? Warum ist das eine Spezialitaet von C++? Dachte das sei einfach nur state-of-the-art von 1970.


Anmelden zum Antworten