2015-10-13 5 views
8

Ausnahmen verwenden den statischen Typ eines Objekts copy-initialize das geworfene Objekt. Zum Beispiel:Warum müssen geworfene Objekte kopieninitialisiert werden?

struct foo 
{ 
    foo() = default; 
    foo(const foo&) = delete; 
}; 

int main() 
{ 
    throw foo(); 
} 

Clang++ --std=c++14 beklagt, dass das explizit gelöscht Copykonstruktor nicht verwendet werden kann. Warum kann nicht stattdessen move-initialisiert werden?

+0

Ich kann es nicht mehr löschen, weil es Antworten hat, aber ich stimme, wegen eines "einfachen typografischen Fehlers" als Off-Topic zu schließen. Mein Problem war nicht so trivial wie dieses, aber ich habe eindeutig vergessen, einen Move-Konstruktor zu erstellen. – zneak

+0

Dank Ihrer Frage habe ich etwas gelernt. Bitte stimmen Sie nicht ab, um es zu schließen, und überhaupt nicht löschen Sie es nicht !! –

Antwort

9

Es kann nicht move konstruiert werden, da der Typ keinen Move-Konstruktor hat. Ein Konstruktor für gelöschte Kopien unterdrückt den impliziten Move-Konstruktor.

4

Weil foo(foo&&); fehlt. Durch delete In dem Kopierkonstruktor haben Sie den Konstruktor move unterdrückt.

+0

Der Verschiebungskonstruktor wird nicht gelöscht, nur abwesend. –

+0

@ JonathanWakely Was ist "nicht gelöscht, nur fehlt"? Das Löschen des Kopierkonstrukts löscht implizit auch den Bewegungskonstruktor – SergeyA

+0

@ JonathanWakely: Zwei leicht unterschiedliche Bedeutungen von "gelöscht". Ich denke besser, was man kann und was nicht. Wie zum Beispiel einen Move-Konstruktor definieren. –

6

den Code der folgenden ändern:

struct foo 
{ 
    foo() = default; 
    foo(const foo&) = delete; 
    foo(foo&&) = default; 
}; 

int main() 
{ 
    throw foo(); 
} 

this lesen, die im Abschnitt "Implizit deklarierte Bewegung Konstruktor".

3

Die anwendbare Formulierung von der Norm (§ [class.copy]/9) sieht in etwa wie folgt aus (na ja, genau so, wie der N4296):

Wenn die Definition einer Klasse X tut nicht explizit einen Zug Konstruktor deklarieren, wird eine implizit als ausgefallen, wenn und nur erklärt, wenn:

  • X kein Benutzer deklarierte Kopie ctor hat,

[...]

Dies gilt, weil die Definition der Kopie ctor als gelöscht bedeutet immer noch, dass Sie die Kopie ctor deklariert haben.

Verwandte Themen