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

来自cppreference.com
< cpp‎ | memory‎ | out ptr t
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾收集器支持
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)



 
std::out_ptr_t
成员函数
out_ptr_t::operator Pointer*out_ptr_t::operator void**
非成员函数
 
operator Pointer*() const noexcept;
(1) (C++23 起)
operator void**() const noexcept;
(2) (C++23 起)

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

1) 转换 *this 为所存储的 Pointer 对象的地址。
2) 转换 *this 为一个 void* 对象的地址。此转换函数仅若 Pointervoid* 不同才参与重载决议,而若 Pointer 不是指针类型则程序非良构。
void* 对象的初值等于存储的 Pointer 对象的值转换到 void*,而任何对它的修改都对用于析构函数Pointer 值有影响。在 *this 的生存期外访问该 void* 拥有未定义行为。

一旦在一个 out_ptr_t 对象上调用了这两个转换函数之一,则不应当调用另一个,否则行为未定义。

参数

(无)

返回值

1) 存储的 Pointer 对象的地址。
2) 满足前述要求的 void* 对象的地址。

注解

若返回值所指向的对象未被写入,则它等于 nullptr

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

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

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

示例