向前声明使用的unique_ptr? [重复](Forward declaration with

2019-06-21 04:31发布

这个问题已经在这里有一个答案:

  • 是的std ::的unique_ptr <T>要知道T的完整定义需要的? 7个回答

我认为它是有用使用正班宣言结合std::unique_ptr如下面的代码。 它编译,并与海湾合作委员会的工作,但整个事情似乎有种奇怪,我不知道这是否是标准的行为(即标准所要求的)? 由于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)被定义。

Answer 1:

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

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



文章来源: Forward declaration with unique_ptr? [duplicate]