Let's say I got a Foo
class containing an std::vector
constructed from std::unique_ptr
objects of another class, Bar
.
typedef std::unique_ptr<Bar> UniqueBar;
class Foo {
std::vector<UniqueBar> bars;
public:
void AddBar(UniqueBar&& bar);
};
void Foo::AddBar(UniqueBar&& bar) {
bars.push_back(bar);
}
This one results in a compilation error (in g++ 4.8.1) saying that the the copy constructor of std::unique_ptr
is deleted, which is reasonable. The question here is, since the bar argument is already an rvalue reference, why does the copy constructor of std::unique_ptr
is called instead of its move constructor?
If I explicitly call std::move
in Foo::AddBar
then the compilation issue goes away but I don't get why this is needed. I think it's quite redundant.
So, what am I missing?
See Question&Answers more detail:os