【发布时间】:2014-08-30 16:11:27
【问题描述】:
我的目标是为我的新库提供 abi 兼容性。 我期待使用 unique_ptr 而不是原始指针。但是我担心如果我更新标准库,我可能会破坏 abi。这是真的吗?在未来的 stdlib 版本中是否保证 unique_ptrs 的双稳定性?
【问题讨论】:
标签: c++11 unique-ptr abi pimpl-idiom
我的目标是为我的新库提供 abi 兼容性。 我期待使用 unique_ptr 而不是原始指针。但是我担心如果我更新标准库,我可能会破坏 abi。这是真的吗?在未来的 stdlib 版本中是否保证 unique_ptrs 的双稳定性?
【问题讨论】:
标签: c++11 unique-ptr abi pimpl-idiom
正如您在this blog post 中看到的那样,该问题是已知的并且正在解决中。就目前的情况而言,恐怕您能做的最好的事情就是与您的编译器供应商核实他们是否提供任何保证(例如,不会在次要版本中破坏 ABI)。
【讨论】:
当您使用自定义删除器时,问题就出现了。 unique_ptr(与 shared_ptr 不同)析构函数需要知道对象的完整类型。所以需要在数据成员声明中指定删除器:
class Foo {
private:
std::unique_ptr <FooImpl> _pimpl;
};
在实例化 pimpl 时,您必须使用默认删除器。 如果你想要一个自定义的删除器,你需要在声明中指定它
class Foo {
private:
std::unique_ptr <FooImpl, std::function <void (FooImpl*&)> > _pimpl;
};
但是,您无法灵活选择是否希望 unique_ptr d'tor 调用默认删除器或自定义删除器。 更灵活的选项是第二个版本,但如果您选择保留默认行为,则必须使用与默认删除等效的特定删除器实例化 unique_ptr。
IMO,这是将 unique_ptr 用于 pimpl idiom 的一个重大缺点。
【讨论】: