首先阅读 Herb 的 Sutters GotW 关于 C++11 中 pimpl 的帖子:
我在理解 GotW #101 中提出的解决方案时遇到了一些麻烦。据我所知,GotW #100 中辛苦解决的所有问题都卷土重来:
成员是离线模板,并且定义在
pimpl
使用点不可见(在class widget
的类定义和隐式生成的特殊成员函数中widget
)。也没有任何明确的实例化。这将在链接期间导致未解决的外部错误。widget::impl
在定义实例化的地方仍然不完整pimpl<widget::impl>::~pimpl()
(我认为它实际上根本没有实例化,只是被引用)。因此调用指向不完整类型的指针,如果具有非平凡的析构函数,则会产生未定义的行为。std::unique_ptr<widget::impl>::~unique_ptr()
delete
widget::impl
请解释是什么迫使编译器在完整的上下文中生成特殊成员widget::impl
。因为我看不出这是如何工作的。
widget::~widget()
如果 GotW #101 仍然需要在实现文件中明确定义widget::impl
,那么请解释“更强大”的评论(@sehe 在他的回答中引用)。
我正在查看 GotW #101 的核心主张,即包装“消除了一些样板文件”,在我看来(基于本段的其余部分)意味着widget::~widget()
声明和定义。所以请不要在你的答案中依赖它,在 GotW #101 中,那已经消失了!
Herb,如果您路过,请让我知道是否可以在此处剪切+粘贴解决方案代码以供参考。