首页 >后端开发 >C++ >`std::unique_ptr` 需要 T 的完整定义吗?

`std::unique_ptr` 需要 T 的完整定义吗?

Barbara Streisand
Barbara Streisand原创
2024-12-25 14:10:15941浏览

Does `std::unique_ptr` Need a Complete Definition of T?

是 std::unique_ptr需要知道 T 的完整定义吗?

std::unique_ptr 是吗?需要有它管理的类型 T 的完整定义吗?这个问题源于 std::unique_ptr 的观察。当事物被前向声明时,无法在 Visual Studio 2010 SP1 中编译。

Visual Studio 2010 SP1 中的实现相关行为

Visual Studio 2010 SP1 中的行为表明它的 std::unique_ptr 实现需要 Thing 的完整定义。这不是标准要求,而是特定于实现的选择。

标准库中的部分异常

虽然大多数 C 标准库模板需要完整类型,但 std ::shared_ptr 和 std::unique_ptr 是部分例外。它们的一些函数可以用不完整的类型实例化,因为它们在支持诸如指向实现的指针(pimpl)模式之类的习惯用法中发挥着作用。但是,在某些操作中使用不完整类型可能会导致未定义的行为,例如删除不完整的对象。

不同操作的类型完整性要求

std::unique_ptr 和std::shared_ptr 在不同情况下需要完整的类型。例如, ~std::unique_ptr 需要其析构函数使用完整类型,而 std::unique_ptr(A*) 如果从中接管指针,则允许使用不完整类型。表格总结了这些要求:

Operation std::unique_ptr std::shared_ptr
Default constructor incomplete incomplete
Copy constructor - incomplete
Move constructor incomplete incomplete
Destructor complete incomplete
Constructor from pointer incomplete complete
Copy assignment - incomplete
Move assignment complete incomplete
Reset without argument complete incomplete
Reset with argument complete complete

总之,虽然 std::unique_ptr 本身并不需要 C 标准中的完整类型定义,但某些实现(如 Visual Studio 2010 SP1)可能会强加这样的要求。重要的是要了解所使用的实现的具体要求,以避免未定义的行为。

以上是`std::unique_ptr` 需要 T 的完整定义吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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