【问题标题】:Forward declaration with unique_ptr? [duplicate]带有 unique_ptr 的前向声明? [复制]
【发布时间】:2012-11-05 01:32:13
【问题描述】:

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

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&lt;B&gt; 的析构函数)是在特定的编译单元 (A.cpp) 中定义的。

【问题讨论】:

    标签: c++ destructor forward-declaration unique-ptr


    【解决方案1】:

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

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

    【讨论】:

    • "这部分违背了使用 std::unique_ptr 的目的" 你是什么意思?如果不声明dtor,类实例不会自动删除其成员吗?
    • 那么,由于 C++ 标准为 unique_ptr 定义了自定义规则以使其正常工作,因此无法创建具有与 unique_ptr 类似功能的自定义模板类?
    • 哇,这是导致问题的析构函数。一旦我在 .cpp 文件中明确定义它,一切都消失了。
    • 如果 A.hpp 是一个抽象类,这将如何解决?
    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2021-10-19
    相关资源
    最近更新 更多