C ++ 11在构造函数中初始化std :: vector of std :: shared_ptr

时间:2015-05-23 16:40:57

标签: c++ c++11 vector move-semantics

我有一个std :: shared_ptr向量的typedef,如下所示:

typedef std::vector<std::shared_ptr<Foo> > FooMap;

然后我有一个Bar类,其中FooMap成员声明为:

FooMap _foos;

Bar构造函数如下所示:

Bar::Bar(FooMap& foos) : _foos(foos) {}

我也尝试过:

Bar::Bar(FooMap& foos) : _foos(std::move(foos)) {}

两者都不会编译。我明白了:

error: no match for call to 
‘(FooMap {aka     std::vector<std::shared_ptr<Foo> >}) (FooMap&)’

或:

error: no match for call to 
‘(FooMap {aka std::vector<std::shared_ptr<Foo> >})
(std::remove_reference<std::vector<std::shared_ptr<Foo> >&>::type)

分别

当我调用Bar构造函数时,我从另一个类中获取FooMap:

FooMap foo = baz1.foos();

然后

Bar bar(foo);

Bazfoos()方法是:

const FooMap& Baz::foos() const { return myFooMap; }

移动构造函数我仍然想弄清楚,但我绝对不能理解为什么第一个不使用std :: vector复制构造函数。

我误解了什么?

1 个答案:

答案 0 :(得分:2)

以下是一个完美无缺的例子:

#include <memory>
#include <vector>

class Foo {
};

typedef std::vector<std::shared_ptr<Foo> > FooMap;

class Bar {
    public:
        Bar(FooMap & foos):
            foos_(foos)
        {}

    private:
        FooMap foos_;
};

int main() {
    FooMap f = { std::make_shared<Foo>(), std::make_shared<Foo>() };
    Bar b(f);
}