Скажем, у меня есть класс Foo
, содержащий std::vector
, построенный из объектов std::unique_ptr
другого класса, 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);
}
Это приводит к ошибке компиляции (в g++ 4.8.1), говорящей, что конструктор копирования std::unique_ptr
удален, что является разумным. Вопрос здесь в том, что аргумент bar уже является ссылкой rvalue, почему вместо конструктора перемещения вызывается конструктор копирования std::unique_ptr
?
Если я явно вызываю std::move
в Foo::AddBar
, то проблема компиляции исчезает, но я не понимаю, почему это необходимо. Я думаю, что это довольно избыточно.
Итак, что мне не хватает?