假设我有一个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);
}
Run Code Online (Sandbox Code Playgroud)
这导致编译错误(在g ++ 4.8.1中)说复制构造函数std::unique_ptr被删除,这是合理的.这里的问题是,因为bar参数已经是一个右值引用,为什么std::unique_ptr要调用复制构造函数而不是它的移动构造函数?
如果我明确地调用std::move,Foo::AddBar那么编译问题就会消失,但我不明白为什么需要这样做.我认为这是多余的.
那么,我错过了什么?