2016-03-21 5 views
8

constの正確さを尖ったメンバーに拡張する正しい方法はありますか?このコード例では、getメソッドの定数バージョンがstd::shared_ptrという参照カウンタを内部メンバm_bと同じにするか、または0から再びカウントを開始していますか?共有ポインターとconstの正確さ

class A 
{ 
    std::shared_ptr<B> m_b; 

public: 

    std::shared_ptr< const B > get_b() const 
    { 
     return m_b; 
    } 

    std::shared_ptr<B> get_b() 
    { 
     return m_b; 
    } 
} 
+0

'cbeginを()'標準的なコンテナの 'cend()'(http://en.cppreference.com/w/cpp/container/vector/begin)を参照してください。 – filipos

答えて

7

shared_ptrあなたが別のshared_ptrから構築する際に、必ず参照カウントを保持します。 unsafelyを使用する唯一の方法は、生ポインタから構成することです:shared_ptr<...>(my_ptr.get()) // don't do this

また、Library Fundamentals TS v2のpropagate_constラッパーにも興味がありますので、すぐに実装で利用できるようになります。

0

答えは、use_count()でいくつかのテストを行うことによって推測できます。

はまた、方法の解像度は完全に明白ではないかもしれどのように気づく:

class B {}; 

class A { 
    std::shared_ptr<B> m_b; 

public: 
    A() { m_b = std::make_shared<B>(); } 

    std::shared_ptr<const B> get_b() const { 
    std::cout << "const" << std::endl; 
    return m_b; 
    } 

    std::shared_ptr<B> get_b() { 
    std::cout << "non const" << std::endl; 
    return m_b; 
    } 
}; 

int main(int, char **) { 

    A a; 

    std::shared_ptr<B> b = a.get_b(); 

    std::cout << b.use_count() << std::endl; 

    std::shared_ptr<const B> cb = a.get_b(); 

    std::cout << cb.use_count() << std::endl; 

    const A &a_const_ref = a; 

    std::shared_ptr<const B> ccb = a_const_ref.get_b(); 

    std::cout << ccb.use_count() << std::endl; 

    return 0; 
} 

出力:

non const 
2 
non const 
3 
const 
4 
ます。また `方法に類似get_const_bを()`、実装したい場合があります
+0

ここでは直感的に正確なものを明確にすることができますか?どのような落とし穴が予想されますか?結果はかなり論理的で安全です。 – filipos

+0

'get_b()'への2回目の呼び出しが 'const'バージョンに解決されると考える人もいます。また、同じrefカウンタが3回目の呼び出しによってインクリメントされます。これは質問自体に対する答えです。 –

+0

私の答えはちょっと言い換えて、落とし穴に重点を置くわけではありませんでした。 –

関連する問題