2015-10-13 25 views
8

Le eccezioni utilizzano il tipo statico di un oggetto su copy-initialize l'oggetto generato. Per esempio:Perché gli oggetti lanciati devono essere inizializzati in copia?

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

int main() 
{ 
    throw foo(); 
} 

Clang++ --std=c++14 lamenta che il costruttore di copia esplicitamente eliminati non può essere utilizzato. Perché non può essere spostato-inizializzato invece?

+0

Non riesco più a eliminarlo perché ha delle risposte ma sto votando per chiudere come off-topic a causa di un "semplice errore tipografico". Il mio problema non è stato così banale come questo, ma ho chiaramente dimenticato di creare un costruttore di mosse. – zneak

+0

Grazie alla tua domanda ho imparato qualcosa. Si prega di non votare per chiuderlo, e con tutti i mezzi per non cancellarlo !! –

risposta

9

Non può essere spostato perché il tipo non ha un costruttore di mosse. Un costruttore di copie cancellato sopprime il costruttore di mosse implicito.

4

perché foo(foo&&); manca. Con il delete del costruttore di copie hai rimosso anche il costruttore di mosse.

+0

Il costruttore di mosse non è cancellato, solo assente. –

+0

@JonathanWakely cosa è 'non eliminato, manca solo'? L'eliminazione del costruttore di copie cancella implicitamente anche il costruttore di movimenti – SergeyA

+0

@JonathanWakely: due sensi leggermente diversi di "cancellato". Penso che sia meglio esplicitare ciò che si può e non si può fare. Come definire un costruttore di mosse. –

6

modificare il codice per il seguente:

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

int main() 
{ 
    throw foo(); 
} 

Leggi this, la sezione "mossa costruttore Implicitamente-dichiarato".

3

Il fraseggio applicabile dallo standard (§ [class.copy]/9) si presenta più o meno come questo (o meglio, esattamente come questo, come di N4296):

Se la definizione di una classe X fa non dichiarare in modo esplicito un costruttore mossa, uno sarà implicitamente dichiarato come default se e solo se:

  • x non ha una copia ctor user-dichiarato,

[...]

Ciò si applica perché definire il copistocro come cancellato significa comunque aver dichiarato il codec copia.

Problemi correlati