前向声明与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
的目的。