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?
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.
Ändern Sie den Code wie folgt:
%Vor%Lesen Sie dies , den Abschnitt "Implizit deklarierter Move-Konstruktor".
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.