Quando C++ è stato creato, è stato deciso che costruttore di default, costruttore di copia, assegnazione operatore e distruttore verrebbero generati automaticamente (a meno che non in dotazione). Perché ? Perché i compilatori C++ dovrebbero essere in grado di compilare (la maggior parte) codice C con semantica identica, ed è così che struct
funziona in C.
Tuttavia, è stato successivamente notato che ogni volta che un utente scrive un distruttore personalizzato, probabilmente ha bisogno di scrivere un anche operatore di copia/costruttore di copia personalizzato; questo è noto come Rule of Big Three. Con il senno di poi, possiamo vedere che si sarebbe potuto specificare che il generatore di copia/costruttore/distruttore generato sarebbe stato generato solo se nessuno dei 3 fosse stato fornito dall'utente e avrebbe aiutato a catturare molti bug. .. e mantengono comunque la retrocompatibilità con C.
Pertanto, con l'arrivo del C++ 11, è stato deciso che questa volta le cose sarebbero andate bene: il nuovo operatore di movimento-costruttore e spostamento-assegnazione sarebbe stato generato automaticamente se era chiaro che l'utente non stava facendo nulla di "speciale" con la classe. Qualunque cosa "speciale" viene definita come ridefinizione del comportamento di spostamento/copia/distruzione.
Per aiutare nel caso in cui le persone avrebbero fatto qualcosa di speciale ma volevano ancora metodi "generati automaticamente", è stato aggiunto anche il rivestimento in zucchero = default
.
Sfortunatamente, per motivi di compatibilità con le versioni precedenti, il comitato C++ non ha potuto tornare indietro nel tempo e modificare le regole di generazione automatica per copia;
Vorrei che lo avessero deprecato per aprire la strada alla prossima versione dello Standard, ma dubito che lo faranno.
è tuttavia deprecato (vedere §12.8/7 per il costruttore di copie, ad esempio, per gentile concessione di @Nevin).
fonte
2013-03-26 10:38:03
Da un semplice punto di vista concettuale (attenzione, nessuna spiegazione tecnica), i due non sono uguali, ad es. ogni oggetto copiabile è mobile ma non viceversa. Lo spostamento è piuttosto un caso speciale di copia applicabile in determinate situazioni. Quindi ha senso che il loro comportamento di autogenerazione sia in qualche modo distorto. Ma lascio a qualcun altro la traduzione in standard tecnico con esempi appropriati. Altro che buona domanda, ovviamente. –