首页 >后端开发 >C++ >为什么 Pimpl Idiom 中的'std::unique_ptr”因类型不完整而失败?

为什么 Pimpl Idiom 中的'std::unique_ptr”因类型不完整而失败?

DDD
DDD原创
2024-12-13 05:01:11460浏览

Why Does `std::unique_ptr` Fail with Incomplete Types in Pimpl Idiom?

std::unique_ptr 和不完整类型:深入了解

考虑使用 std::unique_ptr:

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // won't compile
};
但是,由于以下原因,出现了编译错误不完整类型:

“‘sizeof’对不完整类型‘uixx::window::window_impl’的无效应用”
传统上,std::unique_ptr 与不完整类型兼容。那么,问题出在哪里呢?

问题的症结:破坏

关键在于破坏。如果 pimpl 与 unique_ptr 一起使用,则必须显式声明析构函数:

class foo {
    class impl;
    std::unique_ptr<impl> impl_;

public:
    foo(); // Constructor may need external definition

    ~foo(); // Implement (braceless or with = default;) once impl is complete
};
如果没有,编译器会生成一个默认析构函数,需要完整声明 foo::impl。

模板问题和静态持续时间实例

使用模板构造函数,即使impl_ 成员未构造:

template <typename T>
foo::foo(T bar) {
    // Compiler requires knowledge of impl_ destruction at compile time!
}
此外,在命名空间范围内使用具有不完整类型的 unique_ptr 会失败:

class impl;
std::unique_ptr<impl> impl_;
编译器需要知道如何销毁此静态持续时间对象。解决方法包括定义自定义类型:

以上是为什么 Pimpl Idiom 中的'std::unique_ptr”因类型不完整而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn