std::unique_ptr 的不完整类型障碍
使用不完整类型的 std::unique_ptr 会引发编译问题。当将 pimpl 习惯用法与 std::unique_ptr 一起使用时,类似以下的代码可能会触发此类问题:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // compilation failure };
遇到有关不完整类型的编译错误,因为 std::unique_ptr 需要完整的类型定义。
揭示根本原因:破坏缺陷
尽管 std::unique_ptr 和不完整类型之间存在预期的兼容性,但问题源于缺少析构函数声明。编译器生成的默认构造函数需要完整声明已实现的类。
要纠正此问题,请在外部类中显式定义析构函数,以确保其在已实现的类完成时可用:
class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // May require a default constructor defined elsewhere ~foo(); // Implement with an empty body or use "= default;" };
模板构造函数的注意事项
定义模板构造函数会使事情变得复杂,即使实现的成员未初始化:
template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction in case of exceptions }
命名空间级别限制
在命名空间范围内使用带有不完整类型的 std::unique_ptr 也会带来挑战:
class impl; std::unique_ptr<impl> impl_;
编译器需要知道如何销毁静态持续时间对象。补救措施在于将 std::unique_ptr 包装在具有定义的析构函数的自定义结构中:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement with an empty body } impl_;
以上是为什么 `std::unique_ptr` 因类型不完整而失败,以及如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!