std::out_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>::operator void**

来自cppreference.com
 
 
内存管理库
分配器
内存资源
未初始化存储 (C++20 前*)
垃圾收集器支持 (C++23 前)
 
 
operator Pointer*() const noexcept;
(1) (C++23 起)
(C++26 起为 constexpr)
operator void**() const noexcept;
(2) (C++23 起)

暴露 Pointervoid* 对象的地址给一般会重初始化它的外来函数。

1)*this 转换成所存储的 Pointer 对象的地址。
如果已经在 *this 上调用了 operator void**(),那么行为未定义。
2)*this 转换成一个 void* 对象的地址。
此重载只有在 std::is_same_v<Pointer, void*>false 时才会参与重载决议。
如果 std::is_pointer_v<Pointer>false,那么程序非良构。
返回满足以下所有条件的指针 ptr
  • *ptr 的初始值等价于存储的 Pointer 对象的值转换到 void*
  • *this 的最后一次修改后的所有对 *ptr 的修改都对用于析构函数Pointer 值有影响。
如果已经在 *this 上调用了 operator Pointer*(),那么行为未定义。
如果在 *this 的生存期外访问了 *ptr,那么行为未定义。

返回值

1) 到存储的 Pointer 对象的指针。
2) 到满足前述要求的 void* 对象的指针。

注解

如果返回值所指向的对象未被写入,那么它等于 nullptr

常见实现上,每个作为指针类型的 Pointer 对象表示均与 void* 的兼容,从而这些实现常在 Pointer 对象的存储内存储该 void* 对象,不需要额外存储:

  • 如果实现启用基于类型的别名分析(依赖严格别名化规则),那么可以使用正确对齐的 std::byte[sizeof(void*)] 成员子对象,而两个转换函数都返回在该数组内隐式创建的对象的地址。
  • 否则,可将 Pointer 成员子对象用于两个转换函数,而 operator void** 可以直接返回 reinterpret_castvoid** 的其地址。

如果 Pointer 是对象表示与 void* 的不兼容的指针类型,那么可能需要额外的 bool 标志记录是否调用了 operator Pointer*(或 operator void**)。

示例

Morty Proxy This is a proxified and sanitized view of the page, visit original site.