4

慣れるまでに少し時間がかかりましたが、const値ではなく左辺値参照によって関数に共有ポインターパラメーターを取得させる習慣を身につけました (もちろん、元の引数を変更する必要がある場合を除きます)。非への左辺値参照によってそれらを取得しますconst):

void foo(std::shared_ptr<widget> const& pWidget)
//                               ^^^^^^
{
    // work with pWidget...
}

これには、共有ポインターの不要なコピーを回避できるという利点があります。これは、参照カウントをスレッドセーフに増やし、望ましくないオーバーヘッドが発生する可能性があることを意味します。

次のコード スニペットの最後のように、関数から値によって返される共有ポインターを取得するために、やや対称的な習慣を採用することが適切かどうか疑問に思っていました。

struct X
{
    // ...
    std::shared_ptr<Widget> bar() const
    {
        // ...
        return pWidget;
    }
    // ...
    std::shared_ptr<Widget> pWidget;
};

// ...

// X x;
std::share_ptr<Widget> const& pWidget = x.bar();
//                     ^^^^^^

このようなコーディングの習慣を採用する際の落とし穴はありますか? 一般に、返された共有ポインターを参照にバインドするのではなく、別の共有ポインター オブジェクトに割り当てることを好む理由はありますか?

4

3 に答える 3

2

David Rodríguez - dribeas が言ったことに加えて、つまり、const参照にバインドしてもコピーを作成できず、とにかくカウンターがインクリメントされます。次のコードはこの点を示しています。

#include <memory>
#include <cassert>

struct X {
    std::shared_ptr<int> p;
    X() : p{new int} {}
    std::shared_ptr<int> bar() { return p; }
};

int main() {
    X x;
    assert(x.p.use_count() == 1);
    std::shared_ptr<int> const & p = x.bar();
    assert(x.p.use_count() == 2);
    return 0;
}
于 2013-05-01T15:27:36.923 に答える