2015-05-07 11 views
5

Con l'introduzione di C++ 11, trivially copyableness è diventato abbastanza rilevante. Più in particolare nell'uso di "std :: atomic". Le basi sono abbastanza semplici. Una classe foo è banalmente copiabile se:Quali regole determinano se un oggetto è banalmente copiato

foo* src = new foo(); 
foo* dest = malloc(sizeof(foo)); 
memcpy(dest, src, sizeof(foo)); 

ha lo stesso effetto come:

foo* src = new foo(); 
foo* dest = new foo(src); 

Quindi un oggetto in cui la copia della memoria avrà lo stesso effetto di un costruttore di copia. Comunque là, certamente, è una presa. Non ci sono solo costruttori di copie. Ma sposta anche i costruttori, sposta gli operatori di assegnazione. Ecc.

std::is_trivially_copyable può essere utilizzato per verificare se un oggetto è banalmente copiabile. Quindi con prove ed errori è possibile rendere un oggetto banalmente copiabile.

Ma ovviamente un insieme ben definito di regole sarebbe un po 'più bello :). Quindi con la mia richiesta.

risposta

10

Il set di regole più ben definito proviene direttamente dallo standard. Qui ci sono le voci rilevanti standard draft N4296:

tipi Banalmente-copiabili sono definiti in [basic.types]/9 tipi scalari

Cv-qualificati, tipi di classe banalmente copiabili, array di tale i tipi e le versioni con qualificazioni costanti di non volatile sono denominate collettivamente tipi illegalmente copiabili.

classi Banalmente-copiabili sono definite nella [class]/6

Una classe banalmente copiabile è una classe che: non ha costruttori di copia non banali, non ha costruttori mossa non banali , non ha operatori di assegnazione di copia non banali, non ha operatori di assegnazione di mosse non banali e ha un distruttore banale.

costruttori copiare/spostare in [class.copy]/12

Una copia/spostamento di costruzione per la classe X è banale se non è fornita dall'utente, il suo parametro di tipo-list è equivalente alla lista-tipo-parametro di una dichiarazione implicita e se la classe X non ha funzioni virtuali e nessuna classe base virtuale e la classe X non ha membri dati non statici di tipo volatile e il costruttore selezionato per copiare/spostare ogni sottobase della classe di base diretta è banale, e per ogni membro di dati non statici di X che è di tipo di classe (o matrice dello stesso), il costruttore ha selezionato in copiare/spostare quel membro è banale; altrimenti il ​​costruttore copia/sposta non è banale.

Copia/sposta gli operatori di assegnazione in [class.copia]/25

Una copia/spostamento operatore di assegnazione per la classe X è banale se non è fornita dall'utente, il suo parametro di tipo-list è equivalente al parametro di tipo lista di una dichiarazione implicita, e se la classe X non ha funzioni virtuali e non ha classi virtuali di base, e la classe X non ha membri di dati non statici di tipo volatile e l'operatore di assegnazione selezionato per copiare/spostare ogni subobject della classe di base diretta è banale, e per ogni membro di dati non statici di X che è di tipo di classe (o matrice dello stesso), l'operatore di assegnazione selezionato per copiare/spostare quel membro è banale; altrimenti l'operatore di assegnazione copia/spostamento non è banale.

distruttori in [class.dtor]/5

Un distruttore è banale se non è fornita dall'utente e se: il distruttore non è virtuale, tutte le classi base dirette di la sua classe ha distruttori banali, per tutti i membri di dati non statici della sua classe che sono di tipo classe (o array di essi), ciascuna di queste classi ha un distruttore banale. Altrimenti, il distruttore non è banale.

costruttori fornito dall'utente in [dcl.fct.def.default]/5

funzioni esplicitamente-in default e funzioni implicitamente-dichiarate sono chiamati collettivamente le funzioni di default, e l'attuazione sono fornire definizioni implicite per loro (12.1 12.4, 12.8), che potrebbe significare definirli come cancellati. Una funzione è fornita dall'utente se è dichiarata dall'utente e non è esplicitamente impostata in modo predefinito o cancellata nella prima dichiarazione. Una funzione di default esplicito fornita dall'utente (cioè, predefinita in modo esplicito dopo la sua prima dichiarazione ) è definita nel punto in cui è esplicitamente impostata; se tale funzione è definita in modo implicito come eliminato, il programma è mal formato.

La risposta breve è che la risposta breve è talvolta più utile della risposta lunga.

Problemi correlati