我读这个答案霍华德Hinnant(Is std::unique_ptr<T> required to know the full definition of T?),然后这个答案(How is a template instantiated?),我只是在想。如果你有像这样模板实例化和pimpl成语与unique_ptr
class Something {
Something();
~Something();
class Impl;
std::unique_ptr<Impl> impl;
};
的unique_ptr
类时编译将在此时被实例化一个类(因为我可以从上面的其他答案做出来)。那么为什么以后没有定义类Impl
呢?实例化是否需要Impl
的析构函数存在?
注意以下是努力澄清我在上面提出的问题。
我在想这个问题,当编译器检查类Something
的定义时。它会看到嵌套类Impl
的声明,然后它将看到unique_ptr<Impl>
的声明,并在那一点上。它将用Impl
实例化模板unique_ptr
。并且该实例化的代码将包含对Impl
的析构函数的调用。因为在这一点上,我们的代码包含对不完整类的析构函数的调用,上面的代码如何安全?
成员函数为哪个类?我还看到了第一个问题的答案,但仍然不明白,完整的'unique_ptr'类将在代码中的指定类型(指向impl的指针的声明)中实例化,并且该实例化将是调用'Impl'的析构函数的代码,但这个代码还不可见。那么代码是如何编译的? – Curious
@Curious,在链接的答案中,“P”是“shared_ptr”或“unique_ptr”。在你的情况下,隐式生成的拷贝构造函数将调用'unique_ptr'的拷贝构造函数。将该逻辑扩展到其他编译器生成的类的成员函数。 –
我不认为我正在传达我的想法,我会尝试澄清在 – Curious