使用包含std :: unique_ptr的结构体的std :: vector声明类时出错

Sim*_*nAx 5 c++ vector unique-ptr c++11

尽管已经使用C#工作了几年,但在某些时候用C++完成工作仍然很困难.我完全接受智能指针的使用,但现在我面临着以下难题

我有一个结构Foo,例如

struct Foo
{
    Foo(std::unique_ptr<Bar> bar) : m_myBar(std::move(bar)) {}

 private:
    std::unique_ptr<Bar> m_myBar;           
};
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我想要一个包含Foo实例的向量,但是以下行

 std::vector<Foo> m_Foos;
Run Code Online (Sandbox Code Playgroud)

产生编译错误,表示删除了复制构造函数.在SO线程" 为什么我不能将unique_ptr推入向量? "中给出了解释和补救措施.但是,问题涉及一个唯一指针的向量,而我有一个包含唯一指针的结构向量.建议的解决方案是使用移动语义,但这在我的情况下如何适用?或者我应该做别的事吗?

Rei*_*ica 4

正如你所说,m_Foos实际上是另一个类的数据成员(我将其称为FooHolder)。如果您没有为 提供复制构造函数FooHolder,编译器将自动生成一个。该复制构造函数将调用 的所有数据成员的复制构造函数FooHolder,包括m_Foos. 当然, 的复制构造函数std::vector<Foo>包含编译错误,因为Foo它是不可复制的。这可能就是您收到错误的原因。

FooHolder如果您能够并且希望该类可复制,则必须为 提供适当的复制构造函数。否则,您可以只声明一个移动构造函数(可能是默认的),这将使复制构造函数被删除:

struct FooHolder
{
  FooHolder(FooHolder&&) = default;

private:
  std::vector<Foo> m_Foos;
};
Run Code Online (Sandbox Code Playgroud)