Warum müssen geworfene Objekte kopieninitialisiert werden?

8

Ausnahmen verwenden den statischen Typ eines Objekts, um das geworfene Objekt zu initialisieren . Zum Beispiel:

%Vor%

Clang++ --std=c++14 beschwert sich, dass der explizit gelöschte Kopierkonstruktor nicht verwendet werden kann. Warum kann nicht stattdessen move-initialisiert werden?

    
zneak 13.10.2015, 20:14
quelle

4 Antworten

9

Es kann keine Bewegung konstruiert werden, weil der Typ keinen Bewegungskonstruktor hat. Ein Konstruktor für gelöschte Kopien unterdrückt den impliziten Move-Konstruktor.

    
Jonathan Wakely 13.10.2015, 20:19
quelle
6

Ändern Sie den Code wie folgt:

%Vor%

Lesen Sie dies , den Abschnitt "Implizit deklarierter Move-Konstruktor".

    
Andrey Nasonov 13.10.2015 20:22
quelle
4

Weil foo(foo&& ); fehlt. Um delete in dem Kopierkonstruktor, den Sie unterdrückt haben, bewegen Sie auch den Konstruktor.

    
SergeyA 13.10.2015 20:19
quelle
3

Die zutreffende Formulierung aus dem Standard (§ [class.copy] / 9) sieht in etwa so aus (na ja, genauso wie ab N4296):

  

Wenn die Definition einer Klasse X keinen Move-Konstruktor explizit deklariert, wird einer implizit als Standard definiert, wenn und nur wenn:

     
  • X hat keine vom Benutzer deklarierte Kopie ctor,
  •   

[...]

Dies trifft zu, weil das Definieren des copy ctor als gelöscht bedeutet, dass Sie den copy ctor deklariert haben.

    
Jerry Coffin 13.10.2015 20:33
quelle

Tags und Links