带有unique_ptr的转发声明

Forward declaration with unique_ptr

本文关键字:转发 声明 ptr unique 带有      更新时间:2023-10-16

我发现将类的前向声明与std::unique_ptr结合使用很有用,如下代码所示。它编译并与 GCC 一起工作,但整个事情似乎有点奇怪,我想知道这是否是标准行为(即标准要求)?由于当我声明 B 时 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();
};

答.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 definition will do.

我怀疑这与析构函数有关(因此需要调用unique_ptr<B>的析构函数)在特定编译单元(A.cpp)中定义。

这是

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

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