2016-05-10 12 views
0

Gibt es etwas ähnlich dem Post-Inkrement-Operator, um einen Nullzeiger auf Null zu setzen?Move Semantics: Post-Set nullptr

Gewünschtes Verhalten:

Class MyClass{ 
    public: 
    int * ptr; 

    MyClass(MyClass && origin) noexcept; 
    MyClass(){} 
}; 

MyClass::MyClass(MyClass && origin) noexcept: 
    ptr(origin.ptr){origin.ptr=nullptr}; 

Behelfslösung mit wollte semantischen:

int * moveptr(int * & ptr){ 
     int * auxptr=ptr; 
     ptr=nullptr; 
     return auxptr; 
} 

MyClass::MyClass(MyClass && origin) noexcept: ptr(moveptr(origin.ptr)){}; 

Vielleicht etwas aus dem Standard fehlt mir, aber ich konnte nichts eine Art Zeiger darzustellen finden repräsentieren nicht Eigentum aber auch verhindert die versehentliche Sharing eines Zeigers.

Ich könnte ein unique_ptr mit einem benutzerdefinierten Deleter, der nichts tut, aber das würde die ursprüngliche Zuordnung des Zeigers seltsam machen.

+2

ist es wirklich Stört es dich, diese zusätzliche Zeile 'rhs.p = nullptr' zu schreiben? –

+0

Es ist nicht eine Frage der Mühe, eher zu vergessen, es zu tun. – xvan

+0

sowieso ist es die idiomatische Sache zu tun, ich bezweifle, dass es irgendeine vorgefertigte Lösung hat –

Antwort

1

Es gibt keine solche Funktion in C++, Sie müssen es selbst schreiben, wie Sie mit moveptr hatten. Dies ist der gleiche Fall, wenn Sie delete ptr; verwenden, möchten einige Programmierer automatisch ptr auf nullptr setzen, aber delete wird es nicht tun.

Ein weiterer aproach von einigen Codierer verwendet wird, ist swap zu verwenden:

MyClass::MyClass(MyClass && origin) noexcept : ptr(nullptr) 
    { swap(origin); }; 


class MyClass { 
    // ... 
    inline void swap(MyClass & other) { 
     using std::swap; 
     swap(ptr, other.ptr); 
    } 
    // ... 
}; 

aber bevor es zu benutzen, lesen Sie weiter, ob es lohnt sich:

http://scottmeyers.blogspot.com/2014/06/the-drawbacks-of-implementing-move.html

Why do some people use swap for move assignments?

+1

Ich bevorzuge 'std :: exchange':' MyClass :: MyClass (MyClass && Herkunft): ptr (std :: exchange (origin.ptr, nullptr)) noexcept {} ' – ildjarn