这不是std::unique_ptr with an incomplete type won't compile 的伪装。
请考虑以下代码:
#include <memory>
struct X
{
X();
~X();
struct Impl;
std::unique_ptr<Impl> up_;
};
struct Impl {}; // fully visible here
X::X() : up_{nullptr}{}
X::~X() = default;
int main()
{
X x;
}
gcc / clang都吐了一个错误,说Impl
不完整。但是,在 X
完全可见后,我为Impl
提供了默认析构函数,因此IMO代码应该编译。 为什么不呢?现在出人意料:如果我让Impl
成为内部类,即定义
struct X::Impl{};
相反,然后the code compiles,甚至没有提供析构函数。 为什么会这样?我们不应该提供这样的默认析构函数,至少根据第一行中提到的链接吗?
答案 0 :(得分:11)
您有两个名为Impl
的不同结构。
struct X
{
struct Impl; // Here you declare X::Impl
std::unique_ptr<Impl> up_; // Here you create a pointer to a X::Impl
};
struct Impl {}; // Here you declare and define ::Impl
...
int main()
{
X x; // Here X::Impl is still incomplete
}