我发现将类的前向声明与std::unique_ptr
结合使用很有用,如下面的代码所示。它编译并与GCC一起工作,但整个事情似乎有点奇怪,我想知道这是否是标准行为(即标准要求)?因为当我声明unique_ptr
时,B不是完整的类型。
#include <memory>
class B;
class A {
std::unique_ptr<B> myptr;
// B::~B() can't be seen from here
public:
~A();
};
#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)中定义的。
答案 0 :(得分:58)
这显然是合法的。规则是用于实例化的类型
标准库中的模板必须完整,除非
指定。在unique_ptr
的情况下,§20.7.1/ 5说“[...]
unique_ptr的模板参数T可能是不完整的类型。“
指针上有一些需要完整的操作
类型;特别是当物体实际被破坏时(at
至少使用默认删除器)。在您的示例中,例如,if
A::~A()
是内联的,这可能会导致问题。 (请注意,如果你
不要自己声明析构函数,它将是内联的。哪一个
部分地违背了使用std::unique_ptr
的目的。)