Lo standard non impone noexcept sui costruttori di movimento. In quali circostanze è accettabile/necessario un costruttore di mosse da lanciare?Quando dovrei dichiarare un costruttore di mosse senza alcuna eccezione?
risposta
La regola d'oro qui è: Dipende dallo.
Ecco un esempio in cui forze ha senso:
// A lock_guard template somewhere up here...
template<typename mutex_t>
class shared_lock_guard
{
mutex_t *mtx_ptr;
public:
shared_lock_guard(lock_guard<mutex_t> &&other) :
mtx_ptr{other.mtx_ptr}
{
if(this->mtx_ptr){
// this might throw a system_error
// if the syscall fails or if the
// lock state was corrupted.
//
this->mtx_ptr->shared_relock();
}
other.mtx_ptr = nullptr;
}
// rest of implementation, etc...
};
Quando hai davvero altra scelta. La maggior parte delle volte il tuo costruttore di movimento dovrebbe essere noexcept
. E sono di default.
vedere questo: http://www.codingstandard.com/rule/12-5-4-declare-noexcept-the-move-constructor-and-move-assignment-operator/
È particolarmente importante utilizzare noexcept per i tipi che sono destinati ad essere utilizzati con i contenitori della libreria standard. Se il costruttore di movimento per un tipo di elemento in un contenitore non è nient'altro che il , il contenitore utilizzerà il costruttore di copia anziché il costruttore di spostamento .
Puoi darmi un esempio della situazione quando non ho scelta? – Klaufir
@Klaufir Direi che se tu avessi (diciamo) un contenitore che garantisce un comportamento di tipo atomico (o muove tutti o non ne muove nessuno) e i tuoi elementi non potrebbero essere copiati (come handle, ad esempio) - quindi nessun piano B - allora il tuo tipo di elemento non funzionerebbe. –
@Klaufir No, scusate, non ho un esempio :(. Forse un ppl più esperto può inventare qualcosa. – Xaqq
- 1. Come definire correttamente un costruttore di mosse?
- 2. Un costruttore di mosse di default è considerato dichiarato dall'utente?
- 3. È una cattiva forma fornire solo un costruttore di mosse?
- 4. Se std :: array ha un costruttore di mosse?
- 5. È accettabile eliminare la costanza in un costruttore di mosse?
- 6. Visual Studio chiude il debug senza alcuna eccezione o errore
- 7. Perché viene chiamato questo costruttore di copia anziché il costruttore di mosse?
- 8. Quando dovrei dichiarare le variabili in una classe PHP?
- 9. Perché la variabile locale lancia richiama il costruttore delle mosse?
- 10. come eseguire qualcosa se alcuna eccezione accade
- 11. Eccezione nel costruttore statico
- 12. Necessità di dichiarare distruttore come difetto
- 13. Dichiarare di lanciare un'eccezione senza mai lanciarlo
- 14. Come dovrei dichiarare ed esportare i moduli?
- 15. C# che tipo di eccezione dovrei aumentare?
- 16. Quando dovrei usare `--interactive` senza` --tty` in un contenitore Docker?
- 17. Come posso ottenere g ++ per compilare codice C++ 11 con un costruttore di mosse?
- 18. Utilizzo dell'invio delle dipendenze senza alcuna libreria DI
- 19. Che tipo di eccezione dovrei lanciare?
- 20. Dichiarare una variabile senza un valore iniziale
- 21. eccezione di lancio dal costruttore in C++
- 22. junit.framework.AssertionFailedError: Eccezione nel costruttore: (java.lang.NoClassDefFoundError)
- 23. Eccezione imprevista dal costruttore XDocument
- 24. Progettazione senza costruttore predefinito
- 25. Come dichiarare il costruttore di copie nella classe derivata, senza il costrutto predefinito nella base?
- 26. Ricorsione su un elenco di elenchi senza alcuna istanza()
- 27. Perché utilizzare il costruttore di mosse in un'istruzione di reso legale?
- 28. Quando dovrei creare un distruttore?
- 29. C# quale eccezione dovrei aumentare qui?
- 30. Quando dovrei usare un parser?
+1, ma tenere presente che spostare è un'ottimizzazione. Secondo me, i riferimenti ai valori r sono una delle cose che la gente spende troppo tempo a pensare. Il miglior costruttore di movimenti che puoi scrivere è none. Un costruttore di lancio di mosse non è una grande scelta, ma se è la tua unica scelta e il tuo profilo mostra che è un miglioramento rispetto alla copia su un percorso critico, allora sarebbe difficile argomentarlo. –