2011-12-09 16 views
1

私は、次のコードを持っている:それは、これはC++ 11(それはドラフトバージョンであることを使用)とすることを割り当てコンストラクタ有効でないことが判明C++ 11のshared_ptrの割り当て

#include <memory> 

    int main(void) 
    { 
     std::shared_ptr<int> currInt(nullptr); 

     std::shared_ptr<int> newInt(new int); 
     currInt = newInt; 

     return 0; 
    } 

を現在は移動セマンティクスを使用しています。私は理解できない何か。

誰かが私がそれを作るために上記のコードを変更する方法を説明してもらえますか?

+1

割り当ては、移動セマンティクスを使用してはいけません。これは、 'unique_ptr'が対象です。予期せぬ挙動はどういうものですか? –

+1

C++ 11では、shared_ptrのコピーコンストラクタは、ムーブコンストラクタのために削除されます。私は実際に多くの移動意味を理解していません。あなたがClang 3.0でこれをコンパイルしようとすると、あなた自身がエラーを見ることができます。 – Jookia

+2

私はこれがそうであると信じていません。 [このページ](http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr)を参照してください。私の知る限り、情報は最新です。また、このコードはGCC 4.6.1でコンパイルされます。これが私にとって意味をなさない最大の理由は、移動セマンティクスでは、移動元のオブジェクトが「空の」状態になっている必要があることです。これは明らかに 'shared_ptr'では望ましくありません。私が間違っているなら、私を修正してください。 –

答えて

5

shared_ptrのコピーコンストラクタがあります。それ以外の場合は、shared_ptrのポイントは何ですか?

OPによってclang link

しか移動代入演算子が定義されている場合は、コピーコンストラクタが暗黙のうちに shared_ptrが正しく動作しない作り、削除されることを言っています。これは、 Boost changesetでも見ることができます。コピー代入演算子は、 に明示的にを追加してバグを修正しています。

§20.7.2.2.3[util.smartptr.shared.assign]/1-3のコピー割り当て演算子shared_ptrを見つけることができます。

shared_ptr& operator=(const shared_ptr& r) noexcept; 
template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 
template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); 
+1

ああ、バグです。 – Jookia

+2

最初の1つは_copy_代入演算子であり、後の2つは代入演算子であることに注意してください。 /ペタニック; - ] – ildjarn

関連する問題