【发布时间】:2014-01-23 23:02:12
【问题描述】:
假设我有一个 Foo 类,其中包含一个由另一个类 std::unique_ptr 对象 Bar 构造的 std::vector。
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 参数已经是一个右值引用,为什么会调用std::unique_ptr 的复制构造函数而不是它的移动构造函数呢?
如果我在Foo::AddBar 中明确调用std::move,那么编译问题就会消失,但我不明白为什么需要这样做。我认为这很多余。
那么,我错过了什么?
【问题讨论】: