2016-05-10 22 views
0

ポストインクリメントオペレータは、起点ポインタをnullに設定するのに似たものがありますか?移動セマンティクス:ポストセットnullptr

募集行動:

Class MyClass{ 
    public: 
    int * ptr; 

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

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

回避策では、望んでいたセマンティック:

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

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

は、たぶん私は標準から何かが欠けているんだけど、私はへのポインタの種類を表すために何かを見つけることができませんでしたは所有者ではないを表すだけでなく、偶発的なポインタの共有を防止します。

私は何もしないカスタムディターターでunique_ptrを使用できますが、それはポインタの元の割り当てを奇妙にするでしょう。

+2

は実際にそれをしません'rhs.p = nullptr'という余分な行を書くのは気になりますか? –

+0

これをやることを忘れるのではなく、気にすることではありません。 – xvan

+0

とにかくこれは慣用的なことですが、私はそれが何らかのプレマイドの解決策を持っているのではないかと疑います。 –

答えて

1

C++にはこのような機能はありません。moveptrのように自分で書き込む必要があります。 delete ptr;を使用する場合も同じですが、一部のプログラマはptrnullptrに自動的に設定することを希望しますが、deleteはそれを実行しません。

いくつかのプログラマーによって使用される別のaproachはswapを使用することです:

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


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

が、それを使用する前に、その価値があるかどうかで読む:

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

Why do some people use swap for move assignments?

+1

私は 'std :: exchange'を好む:MyClass :: MyClass(MyClass && origin):ptr(std :: exchange(origin.ptr、nullptr)) noexcept {} ' – ildjarn

関連する問題