请从设计的角度忽略可疑的继承模式。谢谢:)
考虑以下情况:
#include <memory>
struct Foo;
struct Bar : std::unique_ptr<Foo> {
~Bar();
};
int main() {
Bar b;
}
在GCC和Clang中,将其编译为独立的TU会引发错误:
In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = Foo]':
required from 'std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = Foo; _Dp = std::default_delete<Foo>]'
error: invalid application of 'sizeof' to incomplete type 'Foo'
static_assert(sizeof(_Tp)>0,
^
这是GCC的,Clang的一个是相似的,都指向struct Bar
的定义。此外,在 main()
之后添加缺少的定义可修复错误:
// Same as above
struct Foo { };
Bar::~Bar() = default;
std::unique_ptr
的析构函数在定义Bar
时需要实例化,这对我来说听起来不对,因为它只被Bar
的析构函数调用了外的线。
我发现甚至更奇怪的是在之后添加定义,其中它们不应该被访问,显然可以解决问题。
第一个片段应该是正确的,如果没有,为什么?第二个修复它的是什么?