unique_ptr 粉刺和不完整类型
unique_ptr pimpl and incomplete types
这不是 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
设为内部 class,即定义
struct X::Impl{};
,然后 the code compiles,甚至 没有 提供析构函数。 为什么会这样?我们是不是应该提供这样一个默认的析构函数,至少根据第一行提到的link?
您有两个不同的结构,名为 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
}
这不是 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
设为内部 class,即定义
struct X::Impl{};
,然后 the code compiles,甚至 没有 提供析构函数。 为什么会这样?我们是不是应该提供这样一个默认的析构函数,至少根据第一行提到的link?
您有两个不同的结构,名为 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
}