Copy initialization trotz deleted copy ctor?



  • habe eine Klasse, in der sämtliche special member functions als deleted definiert wurden

      CommandDispatcher(CommandDispatcher&&) = delete;
      CommandDispatcher(const CommandDispatcher&) = delete;
      CommandDispatcher& operator=(CommandDispatcher&&) = delete;
      CommandDispatcher& operator=(const CommandDispatcher&) = delete;
      CommandDispatcher(const CommandDispatcher&&) = delete;
      CommandDispatcher& operator=(const CommandDispatcher&&) = delete;
    

    folgender Aufruf wird in clion markiert als "move-ctor deleted"

      auto cmdDispatcher = CommandDispatcher{gui};
    

    code compiliertt aber dennoch.

    Wieso denn?


  • Mod

    Als Ergänzung für andere: Der einzige Compiler, der das bei mir gefressen hat, war der neueste Clang mit experimental concepts. Alles andere bricht mit dem zu erwartenden Fehler ab. Das heißt, das ist wahrscheinlich irgendein Vorschlag für C++2a, der dafür sorgt, dass das gültig wird. Da habe ich aber leider gerade nicht die Muße, mich da durch zu wühlen, was Clang da so alles implementiert hat.



  • g++ 7.3 verwende ich hier oO



  • Das könnte durch die Änderungen zu guaranteed copy elision erschlagen werden.

    https://en.cppreference.com/w/cpp/language/copy_elision

    Note: the rule above does not specify an optimization: C++17 core language specification of prvalues and temporaries is fundamentally different from that of the earlier C++ revisions: there is no longer a temporary to copy/move from. Another way to describe C++17 mechanics is "unmaterialized value passing": prvalues are returned and used without ever materializing a temporary.



  • @manni66 sagte in Copy initialization trotz deleted copy ctor?:

    Das könnte durch die Änderungen zu guaranteed copy elision erschlagen werden.

    https://en.cppreference.com/w/cpp/language/copy_elision

    Note: the rule above does not specify an optimization: C++17 core language specification of prvalues and temporaries is fundamentally different from that of the earlier C++ revisions: there is no longer a temporary to copy/move from. Another way to describe C++17 mechanics is "unmaterialized value passing": prvalues are returned and used without ever materializing a temporary.

    Wollt ich grad schreiben. Ich denk das ist ganz normale C++ 17 guaranteed copy elision bei der Arbeit, was hier greift ist [dcl.init] §17.6.1:

    If the initializer expression is a prvalue and the cv-unqualified version of the source type is the same class as the class of the destination, the initializer expression is used to initialize the destination object.

    Der Parser den dein Editor verwendet ist wohl einfach nicht ganz up-to-date… 🙂



  • Clion oO 2 Wochen alte Version

    aber sehr interessant, hatte schon mal gelesen, dass die dinge deleted sein können und dennoch rvo funktioniert

    welche IDE, if any, benutzt ihr denn?



  •   CommandDispatcher(CommandDispatcher&&) = delete;
      CommandDispatcher(const CommandDispatcher&) = delete;
      CommandDispatcher& operator=(CommandDispatcher&&) = delete;
      CommandDispatcher& operator=(const CommandDispatcher&) = delete;
      CommandDispatcher(const CommandDispatcher&&) = delete;
      CommandDispatcher& operator=(const CommandDispatcher&&) = delete;
    

    Nur mal eine Frage am Rande zum eigenen Verständnis:
    Sind die beiden letzten Definitionen mit jeweils 'const' nicht überflüssig? Ich dachte immer man benötigt nur die ersten vier, um alle Fälle korrekt abzudecken.



  • @harteware sagte in Copy initialization trotz deleted copy ctor?:

    Sind die beiden letzten Definitionen mit jeweils 'const' nicht überflüssig? Ich dachte immer man benötigt nur die ersten vier, um alle Fälle korrekt abzudecken.

    ja


Anmelden zum Antworten