2014-11-14 6 views
7

Der Standard erzwingt keine Ausnahmen bei Verschiebungskonstruktoren. Unter welchen Umständen ist es akzeptabel/notwendig für einen Move-Konstruktor zu werfen?Wann sollte ich einen Move-Konstruktor ohne noexcept deklarieren?

+0

+1, aber bedenken Sie, dass Bewegung eine Optimierung ist. Meiner Meinung nach ist der Wert von R-Werten eines der Dinge, an die man viel zu lange denkt. Der beste Move-Konstruktor, den Sie schreiben können, ist keiner. Ein Wurfbewegungskonstruktor ist keine gute Wahl, aber wenn es Ihre einzige Wahl ist und Ihr Profiling zeigt, dass es eine Verbesserung gegenüber der Kopie auf einem kritischen Pfad ist, dann wäre es schwer, dagegen zu argumentieren. –

Antwort

4

Die goldene Regel hier ist: Es kommt auf. Hier

ist ein Beispiel, wo es Macht Sinn:

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

Wenn Sie wirklich keine andere Wahl haben. Die meiste Zeit sollte Ihr Move-Konstruktor noexcept sein. Und sie sind standardmäßig.

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

Es ist besonders wichtig noexcept für Typen zu verwenden, die bestimmt sind, mit der Standardbibliothek Behälter verwendet werden. Wenn der Konstruktor move für einen Elementtyp in einem Container nicht "noexcept" ist, dann verwendet der Container den Konstruktor copy anstelle des Konstruktors move .

+0

Können Sie mir ein Beispiel geben, wenn ich keine Wahl habe? – Klaufir

+0

@Klaufir Ich würde vermuten, dass wenn Sie (sagen wir mal) einen Container haben, der atomares Verhalten garantiert (er bewegt sich entweder alle oder bewegt sich nicht) und Ihre Elemente wären nicht kopierbar (wie zum Beispiel handle) - also kein Plan B - dann würde dein Elementtyp nicht funktionieren. –

+0

@Klaufir Es tut mir leid, ich habe kein Beispiel :(. Vielleicht mehr erfahrene ppl kann etwas einfallen lassen. – Xaqq

Verwandte Themen