unique_ptr pimpl和不完整的类型

时间:2016-01-28 00:36:05

标签: c++ c++11 pimpl-idiom

这不是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成为内部类,即定义

struct X::Impl{};

相反,然后the code compiles,甚至没有提供析构函数。 为什么会这样?我们不应该提供这样的默认析构函数,至少根据第一行中提到的链接吗?

1 个答案:

答案 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
}