Questo è un cattivo schema. Copy-and-swap è migliore.Operatore di assegnamento distruggono e rigenerano: cosa succede se sto attento?
foo & operator = (foo const & other) {
static_assert (noexcept(new (this) foo()), "Exception safety violation");
this-> ~ foo();
try {
new (this) foo(other);
} catch (...) {
new (this) foo(); // does not throw
throw;
}
return * this;
}
Finché foo
è not polymorphic, cosa potrebbe andare male? (Tuttavia, si supponga che è una classe base.)
Background: ho a che fare con il tipo di locale-storage cancellazione, e l'alternativa è quella di implementare swap
come due assegnazioni hard-coded attraverso uno spazio di archiviazione locale. Gli oggetti nei blocchi di memoria dell'origine e della destinazione sono di tipi diversi e semplicemente non possono scambiarsi tra loro. Copia/sposta la costruzione definita in termini di tale scambio è due volte più complicata per apparentemente nessun guadagno.
'nuova (questa) foo(); // non getta' - come fai a essere sicuro che non getti? È un'altra precondizione che stai richiedendo per il tipo, che copia e scambia non è? –
@MikeSeymour I costruttori predefiniti spesso non lanciano. Per quanto riguarda questa domanda, prendila come una dichiarazione di fatto. 'static_assert (noexcept (new (this) foo())," Exception safety violation ");' se preferisci. – Potatoswatter
Programmazione orientata alla cura? –