gpt4 book ai didi

c++ - 带有 unique_ptr 的前向声明?

转载 作者:IT老高 更新时间:2023-10-28 13:22:49 30 4
gpt4 key购买 nike

我发现将类的前向声明与 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<B> 的析构函数)是在特定的编译单元 (A.cpp) 中定义的。

最佳答案

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

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

关于c++ - 带有 unique_ptr 的前向声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414652/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com