1

这是我所拥有的:

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

private:
    int _i;
};

class B
{
    B();

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

我需要_v用两个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移到返回 a 的函数中vector

vector使用 2 个元素复制 a的成本将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 回答