使用unique_ptr进行前向声明?

时间:2012-11-16 10:23:35

标签: c++ destructor forward-declaration unique-ptr

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

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)中定义的。

1 个答案:

答案 0 :(得分:58)

这显然是合法的。规则是用于实例化的类型 标准库中的模板必须完整,除非 指定。在unique_ptr的情况下,§20.7.1/ 5说“[...] unique_ptr的模板参数T可能是不完整的类型。“

指针上有一些需要完整的操作 类型;特别是当物体实际被破坏时(at 至少使用默认删除器)。在您的示例中,例如,if A::~A()是内联的,这可能会导致问题。 (请注意,如果你 不要自己声明析构函数,它将是内联的。哪一个 部分地违背了使用std::unique_ptr的目的。)