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;
}

Live on Coliru

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
}