88

std::unique_ptr我发现将类的前向声明与下面的代码结合使用很有用。它编译并与 GCC 一起工作,但整个事情看起来有点奇怪,我想知道这是否是标准行为(即标准要求)?由于 B 在我声明unique_ptr.

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)中定义的析构函数(因此需要调用 的析构函数)有关。

4

1 回答 1

92

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

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

于 2012-11-16T10:36:31.470 回答