【发布时间】:2012-01-25 14:21:50
【问题描述】:
首先阅读 Herb 的 Sutters GotW 关于 C++11 中的 pimpl 的帖子:
我在理解 GotW #101 中提出的解决方案时遇到了一些问题。据我所知,在 GotW #100 中辛苦解决的所有问题都卷土重来:
pimpl成员是离线模板,在使用时定义是不可见的(在class widget的类定义和隐式生成的widget的特殊成员函数中) .也没有任何明确的实例化。这将在链接期间导致未解决的外部错误。widget::impl在pimpl<widget::impl>::~pimpl()被instantiated定义的地方仍然不完整(我认为它实际上根本没有被实例化,只是被引用)。所以std::unique_ptr<widget::impl>::~unique_ptr()在指向不完整类型的指针上调用delete,如果widget::impl有一个非平凡的析构函数,则会产生未定义的行为。
请解释是什么迫使编译器在 widget::impl 完整的上下文中生成特殊成员。因为我看不出这是如何工作的。
如果 GotW #101 仍需要在实现文件中明确定义 widget::~widget(),其中 widget::impl 已完成,请解释“更强大”的评论(@sehe 在他的回答中引用)。
我正在查看 GotW #101 的核心声明,即包装器“消除了一些样板文件”,在我看来(基于该段的其余部分)意味着 widget::~widget() 声明和定义。所以请不要在你的回答中依赖它,在 GotW #101 中,它已经消失了!
Herb,如果你路过,请告诉我是否可以在此处剪切+粘贴解决方案代码以供参考。
【问题讨论】:
-
PagingDr. @HerbSutter -
@Ben Voigt:我确实使用 gotw 搜索并标记了其他几个问题。你找到了我错过的一些吗?
-
@Ben Voigt:那么一定是 Stack Exchange 中的传播延迟。在为这个问题创建标签后,我立即将标签添加到其他几个问题中。从那时起,我又发现了一个问题,并对其进行了标记。
-
我刚刚阅读了文章,我在理解它如何更好方面遇到了同样的困难——因为显然不是,或者代码不完整。我通过谷歌“gotw #101 不起作用”到达那里 :)
标签: c++ c++11 pimpl-idiom incomplete-type gotw