带有unique_ptr的转发声明
Forward declaration with unique_ptr
我发现将类的前向声明与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
的目的。
相关文章:
- 如何在 C++ 中转发声明 std::set?
- C++使用默认模板参数键入别名和转发声明
- 如何转发声明枚举?
- 使用函数指针转发声明作为 lamba 声明
- 如何将枚举类转发声明为模板化类的内部类?
- 转发声明在命名空间中不起作用的替代方法
- 如何正确转发声明结构"using XXX"?
- 在类内和类外的定义处执行类转发声明是否有区别
- 为什么转发声明的好友类不能在类中引用?
- 如何访问转发声明类的成员
- 仅在标头开发中转发声明
- 无法转发声明C typedef结构-正在查找其他建议
- boost::hana 转发声明标头的用例是什么?
- 循环包含依赖项/转发声明
- c++ 使用复杂的依赖项获取正确的转发声明
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 有没有办法转发声明命名空间或只是提前使其可见
- 有没有办法在不引用其模板类型的情况下转发声明指向类的指针
- 我如何转发声明boost ::精神统治
- 标题文件中大规模转发声明类别的风险是什么?