1

ここに私が持っているものがあります:

class A
{
    A(int i):_i(i){}

private:
    int _i;
};

class B
{
    B();

private:
    std::vector< boost::shared_ptr<A> > _v;
}

そして_v、2 つboost::shared_ptr<A>の s で初期化する必要があります。

私はこれを試しました:

B::B():_v(2, boost::make_shared<A>(0)){}

しかし、両方のポインタが唯一の作成されたオブジェクトを指しているようです - 私が必要とするものではありません。

私は持っていないc++11ので使用できません:

B::B():_v{boost::make_shared<A>(0), boost::make_shared<A>(0)}{}

この状況の最善の解決策は何ですか?

4

1 に答える 1

2

の作成を、vectorを返す関数に移動しますvector

vector2 つの要素を持つofをコピーするコストはshared_ptr気にならないほど低くなり、NRVO と RVO を使用すると、C++03 でも完全に最適化される可能性があります。(C++11 では、何らかの理由で NRVO と RVO がブロックされている場合、移動のみを行います)。

 // if you make it a member, make it `static`:
 std::vector<boost::shared_ptr<A> > make_vector() {
    std::vector<boost::shared_ptr<A> > retval;
    retval.push_back( boost::make_shared<A>(0) );
    retval.push_back( boost::make_shared<A>(0) );
    return retval;
 }
 B::B():_v( make_vector() ) {}
于 2013-10-09T18:41:09.900 に答える