2014-11-14 7 views
7

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?

+0

+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. –

risposta

4

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... 
}; 
5

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 .

+0

Puoi darmi un esempio della situazione quando non ho scelta? – Klaufir

+0

@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. –

+0

@Klaufir No, scusate, non ho un esempio :(. Forse un ppl più esperto può inventare qualcosa. – Xaqq

Problemi correlati