2014-11-14 13 views
7

Standard nie wymusza żadnego wyjątku na konstruktorach ruchu. W jakich okolicznościach jest to dopuszczalne/konieczne, aby konstruktor ruchu mógł rzucić?Kiedy powinienem zadeklarować konstruktor ruchu bez żadnego wyjątku?

+0

+1, ale należy pamiętać, że ruch jest optymalizacją. Moim zdaniem, wartości odniesienia r to jedna z rzeczy, o których ludzie spędzają zbyt dużo czasu na myśleniu. Najlepszy konstruktor ruchu, który możesz napisać, to żaden. Konstruktor ruchu rzucania nie jest świetnym wyborem, ale jeśli jest to twój jedyny wybór, a twoje profilowanie pokazuje, że jest to ulepszenie w stosunku do kopii na krytycznej ścieżce, byłoby ciężko argumentować przeciwko niemu. –

Odpowiedz

4

Złotą zasadą tutaj jest: Zależy od.

Oto przykład, gdzie potęga sens:

// 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

Kiedy naprawdę nie mają wyboru. Najczęściej konstruktor ruchu powinien być noexcept. I są domyślnie.

Zobacz to: http://www.codingstandard.com/rule/12-5-4-declare-noexcept-the-move-constructor-and-move-assignment-operator/

Szczególnie ważne jest, aby używać noexcept dla typów, które są przeznaczonych do stosowania ze standardowymi pojemnikami bibliotecznych. Jeśli przenoszenie konstruktora dla typu elementu w kontenerze nie jest równe zeru, to wówczas kontener użyje konstruktora kopiującego, a nie konstruktora przemieszczania .

+0

Czy możesz podać przykład sytuacji, w której nie mam wyboru? – Klaufir

+0

@Klaufir Przypuszczam, że gdybyś miał (powiedzmy) kontener gwarantujący zachowanie podobne do atomistycznego (albo przesuwałby wszystko albo nie poruszał się), a twoje elementy nie byłyby kopiowalne (na przykład uchwyt) - więc bez planu B - wtedy twój typ elementu nie działałby. –

+0

@Klaufir Nie, przykro mi, nie mam przykładu :(Może bardziej doświadczona ppl może coś wymyślić. – Xaqq

Powiązane problemy