class not copyable



  • Wenn ich eine Klasse mit

    class C{
       ...
    
       C(const C&) = delete;
       C& operator = (const C&) = delete;
       ...
    };
    

    nicht kopierbar mache, bedeutet das, das ich, um eine Kopie zu vermeiden, auf eine const Referenz verzichten kann?



  • lemon03 schrieb:

    Wenn ich eine Klasse mit

    class C{
       ...
    
       C(const C&) = delete;
       C& operator = (const C&) = delete;
       ...
    };
    

    nicht kopierbar mache, bedeutet das, das ich, um eine Kopie zu vermeiden, auf eine const Referenz verzichten kann?

    Meinst Du, ob folgendes den selben Effekt hat?

    class C{
       ...
    
       C(C&) = delete;
       C& operator = (C&) = delete;
       ...
    };
    


  • Nein - das bedeutet, daß du jedesmal eine Fehlermeldung vom Compiler kriegst, wenn du doch eine Kopie erzeugen solltest (explizit oder implizit).
    Also gerade für Parameter wirst du also eine (const) Referenz verwenden müssen.

    Um diese Klasse dann z.B. direkt für einen vector zu verwenden, muß dann ein Move-Konstruktor vorhanden sein, s.a. Insert into vector having objects without copy constructor.



  • Aha, ich sehe, das wird mich in für mich zu tiefe Gewässer führen. Ich werd das mal in meine Klasse rein schreiben und schauen, ob und wann ich

    Th69 schrieb:

    eine Kopie erzeugen (explizit oder implizit)

    werde.

    Kann ich dieses Konstrukt als Sicherheit sehen, ganz bestimmt keine Kopie zu erzeugen?

    edit: Manche schreiben das in den public, manche in den private-Bereich. Weshalb?



  • Ja, damit unterbindest du das Erzeugen einer Kopie und bist dann ein kleines wenig safer unterwegs.



  • Jupp, danke. Gerade getestet und für gut empfunden. Über solche kleinen Dinge freue ich mich immer wieder 😉



  • Mal Frage eines doofen: wenn man den copy-ctor und copy-assignment löscht, werden dann move-ctor und move-assignment auch gleichzeitig mit gelöscht?

    ps: OK, hab's grad ausprobiert. Wenn der copy-ctor und copy-assignment gelöscht sind, dann werden einfach keine move-ctor und move-assignment erzeugt. D.h. es wird dann versucht den copy-ctor bzw. copy-assignment zu verwenden, und da die gelöscht sind, bekommt man die erwünschte Fehlermeldung. Gut 🙂


Log in to reply