Konstruktoraufruf bei temporären Objekten



  • Teste bitte mal std::move (s. Beitrag oben).



  • realistic steak schrieb:

    if(user_name != "0")
             User(user_name);
    

    Wird hier vielleicht im if-scope eine neue Variable user_name definiert und der Standardkonstruktor von User aufgerufen?

    Nein.

    Probier mal folgendes:

    User( std::move(user_name ));
    

    Mit Move Semantics funktionert es! :0
    Aber warum funktionierts nur somit? Das ist mir grad schleierhaft.



  • User(user_name);
    

    ist syntaktisch dasselbe wie

    User user_name;
    

    Du hast also wahrscheinlich noch einen Konstrukor ohne Argumente, der dort aufgerufen wird. Dass es mit std::move funktioniert hat also mit Move-Semantik nichts zu tun.



  • Wieso gehst du da eigentlich nicht mit einem Debugger Schritt für Schirtt durch?
    Dann siehst du ja was passiert...



  • Bashar schrieb:

    User(user_name);
    

    ist syntaktisch dasselbe wie

    User user_name;
    

    Soso! Das ist mir nun aber neu! Wieder was gelernt 😉

    Du hast also wahrscheinlich noch einen Konstrukor ohne Argumente, [...]

    Exakt.

    Wieso gehst du da eigentlich nicht mit einem Debugger Schritt für Schirtt durch?
    Dann siehst du ja was passiert...

    Stimmt, da hast du auf jeden Fall Recht, und ich wäre vmtl. auch selber drauf gekommen. Dachte halt anfangs, dass ich ihn für so ein kleines Ding nicht brauchen würde und 1 - 2 Textausgaben reichen würden.
    Tjo...
    So wars aber nicht! 😃
    Ich nehm mir Deine Worte auf jeden Fall zu Herzen.

    Großes Dankeschön an alle Helfer. 🙂



  • Bin ich eigentlich der Einzige, der findet, dass man das so nicht lösen sollte?

    Syntaktisch würde man hier als Anwendungsprogrammierer nicht erwarten, dass User(xy); überhaupt irgendeinen Effekt hat. Ich würde die Persistenzschicht von der Arbeitsdaten-Schicht der Applikation trennen. Braucht man auch dann, wenn man in irgendeinem Dialog einen Benutzer anlegt und auf Abbrechen klickt, was dann? Diese Lösung hier wird sich wohl bei jeder Vergrößerung des Projekts als unsinnig herausstellen.



  • Eisflamme schrieb:

    Syntaktisch würde man hier als Anwendungsprogrammierer nicht erwarten, dass User(xy); überhaupt irgendeinen Effekt hat.

    std::ofstream("gegenbeispiel.txt");
    

    @<InsertNameHere>: Wenn du schon std::move (C++11) hast:

    std::string beweis = "gegenbeispiel.txt";
    std::ofstream{beweis};
    


  • Btw, eigentlich wären C++11-Tags äusserst praktisch nicht jedesmal im Satz C++11 erwähnen zu müssen.

    [code="cpp11"]
    // C++11-Code
    [/code]



  • Anwendungsprogrammierer schrieb:

    Btw, eigentlich wären C++11-Tags äusserst praktisch nicht jedesmal im Satz C++11 erwähnen zu müssen.

    [code="cpp11"]
    // C++11-Code
    [/code]

    👍
    Hab das mal in "Forentechnik" vorgeschlagen.



  • Anwendungsprogrammierer schrieb:

    Eisflamme schrieb:

    Syntaktisch würde man hier als Anwendungsprogrammierer nicht erwarten, dass User(xy); überhaupt irgendeinen Effekt hat.

    std::ofstream("gegenbeispiel.txt");
    

    Moment, ich habe nicht gesagt, dass das bei jeder Klasse so ist. 😉

    Aber ich erwarte bei einer User-Klasse nicht ein automatisches Mapping aufs Dateisystem. Gut, man kann das natürlich dokumentieren, aber es ist zumindest Mal unüblich, dass ein Objekt zur Datenhaltung (nicht ein Objekt zur Dateiausgabe...) automatisch gespeichert wird.

    Aber gut, muss OP wissen, wollte ich nur zu bedenken geben.


Anmelden zum Antworten