La copia & idioma di scambio per l'operatore di assegnazione restituisce la garanzia di eccezione forte: il valore originale non viene modificato durante la creazione di un nuovo oggetto. Quando si riutilizza la memoria allocata per l'oggetto assegnato, la garanzia di eccezione forte può essere raggiunta in genere solo quando nessuna delle operazioni coinvolte può essere lanciata. Soprattutto quando sono coinvolti modelli di classe (come in std::vector<T>
), in genere non vi è alcuna garanzia che nessuna delle operazioni venga lanciata (ovviamente, std::vector<T>
fornisce solo la garanzia di base sull'assegnazione).
In generale, gli incarichi di copia possono essere lanciati per qualsiasi motivo. Molto probabilmente non dovrebbero gettare per altri motivi che i fallimenti nell'assegnare le risorse ma non c'è nulla nel concetto CopyAssignable che vieta l'operazione dal lancio.
Ho trovato abbastanza comune che le assegnazioni di copia non sono state implementate correttamente e, ad esempio, violano la garanzia di eccezione di base. L'indicatore che questo è il caso è quando l'operatore incaricato dell'assegnazione ha bisogno di verificare l'autoassegnazione: se è effettivamente necessaria un'assegnazione (piuttosto che essere lì, a volte definita come "ottimizzazione" - quanto spesso le persone fanno incarichi ...?), il codice è quasi certamente sbagliato, molto probabilmente non mantenendo la garanzia di base di eccezione. Di conseguenza, ti consiglio di utilizzare l'approccio di copia & a meno che non ci sia un buon motivo per non farlo anche se sono consapevole che usa più memoria (anche se raramente il problema è che non c'è abbastanza memoria, almeno non sui sistemi Sto lavorando, ma piuttosto che l'uso di più memoria potrebbe causare un'esecuzione più lenta).
fonte
2016-05-30 07:20:40
Hai appena risposto alla tua prima domanda? I punti nel sostenere che è un modello utile sono: 1. Riutilizzo del codice e 2. Sicurezza dell'eccezione. – immibis
La parola chiave è "trade-off". Vuoi una forte garanzia? Paga il prezzo. Vuoi pagare di meno? Accetta una garanzia più debole. –
* "i dati non vengono distrutti prima della creazione della copia" * Forse ti sto fraintendendo, ma se distruggi i dati per primi, non sarai in grado di copiarli, vero? – Mario