如何将 unique_ptr 与前向声明类型一起使用?

How to use unique_ptr with forward declared type?

前向声明以避免循环头文件依赖或实现 pimpl 是很常见的,那么最终可能会得到如下代码:

class A;

class B
{
  A * a;
};

当有人试图用 unique_ptr 替换它时:

class A;

class B
{
  std::unique_ptr<A> a;
};

编译器抱怨。让这项工作发挥作用的最佳做法是什么?

需要声明封闭 class B 的析构函数,并在源文件中将其设置为默认值,这样 unique_ptr 就不会强制内联它自己的默认删除器。

class B
{
  public:
  ~B();
  private:
  std::unique_ptr<A> a;
};

并在源文件中

#include <A.h>
... do stuff with ( a )
B::~B() = default;

应该完成这项工作。