Cosa significa “default” dopo la dichiarazione di una funzione di class?

Ho visto l’ default utilizzata accanto alle dichiarazioni di funzione in una class. Che cosa fa?

 class C { C(const C&) = default; C(C&&) = default; C& operator=(const C&) & = default; C& operator=(C&&) & = default; virtual ~C() { } }; 

È una nuova funzionalità di C ++ 11 .

Significa che si desidera utilizzare la versione generata dal compilatore di tale funzione, quindi non è necessario specificare un corpo.

Puoi anche usare = delete per specificare che non vuoi che il compilatore generi automaticamente quella funzione.

Con l’introduzione dei costruttori di mosse e degli operatori di spostamento, le regole per quando vengono generate le versioni automatiche di costruttori, distruttori e operatori di assegnazione sono diventate piuttosto complesse. Usare = default e = delete rende le cose più facili in quanto non è necessario ricordare le regole: devi solo dire cosa vuoi che accada.

Si tratta di una nuova funzione C ++ 0x che indica al compilatore di creare la versione predefinita del rispettivo costruttore o assegnatore, ovvero quella che esegue la copia o l’azione per ogni membro. Questo è utile perché il costruttore di move non è sempre generato di default (ad esempio se hai un distruttore personalizzato), a differenza del costruttore di copie (e allo stesso modo dell’assegnazione), ma se non c’è nulla di non banale da scrivere, è meglio lasciare che il il compilatore lo gestisce piuttosto che scriverlo ogni volta.

Si noti inoltre che un costruttore predefinito non verrà generato se si fornisce un altro costruttore non predefinito. Se vuoi ancora il costruttore predefinito, puoi usare questa syntax per farne il compilatore.

Come altro caso d’uso, ci sono diverse situazioni in cui un costruttore di copia non verrebbe generato in modo implicito (ad esempio se si fornisce un costruttore di spostamento personalizzato). Se desideri ancora la versione predefinita, puoi richiederla con questa syntax.

Vedere la sezione 12.8 dello standard per i dettagli.

È nuovo in C ++ 11, vedi qui . Può essere molto utile se hai definito un costruttore, ma vuoi usare i valori di default per gli altri. Pre-C ++ 11 dovresti definire tutti i costruttori una volta che ne hai definito uno, anche se sono equivalenti ai valori predefiniti.

Si noti inoltre che in alcune situazioni è imansible fornire un costruttore predefinito definito dall’utente che si comporta come il compilatore sintetizzato sotto l’inizializzazione di default e valore . default ti consente di riprendere questo comportamento.

Un altro caso d’uso che non vedo menzionato in queste risposte è che ti permette facilmente di cambiare la visibilità di un costruttore. Ad esempio, forse vuoi che una class di amici sia in grado di accedere al costruttore di copie, ma non vuoi che sia pubblicamente disponibile.