前向声明与unique_ptr?

我发现使用类的前向声明与std::unique_ptr结合使用是很有用的,如下面的代码所示。 它编译和GCC工作,但整个事情似乎有点奇怪,我不知道这是标准的行为(即标准所要求的)? 因为当我声明unique_ptr时B不是一个完整的types。

A.hpp

 #include <memory> class B; class A { std::unique_ptr<B> myptr; // B::~B() can't be seen from here public: ~A(); }; 

A.cpp

 #include "B.hpp" //B.hpp has to be included, otherwise it doesn't work. A::~A() = default; // without this line, it won't compile // however, any destructor definiton will do. 

我怀疑这与析构函数有关(因此需要调用unique_ptr<B>的析构函数)是在特定的编译单元(A.cpp)中定义的。

这是明确的合法的。 规则是用于在标准库中实例化模板的types必须是完整的, 除非另有规定。 在unique_ptr的情况下,第20.7.1 / 5节说:“[…] unique_ptr的模板参数T可能是一个不完整的types。

指针上有一些操作需要完整的types; 特别是当对象实际上被破坏时(至less使用默认的删除器)。 在你的例子中,例如,如果A::~A()是内联的,这可能会导致问题。 (注意,如果你不自己声明析构函数,它将是内联的,这部分地破坏了使用std::unique_ptr的目的。