命名空间
变体
操作

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* 对象的地址。只有当 Pointer 不等于 void* 时,此转换函数才会参与重载解析;如果 Pointer 不是指针类型,则程序格式错误。
void* 对象的初始值等于存储的 Pointer 对象转换为 void* 的值,对其的任何修改都会影响 析构函数 中使用的 Pointer 值。在 *this 的生命周期之外访问 void* 对象会导致未定义的行为。

在对 out_ptr_t 对象调用这两个转换函数之一后,就不应该再对它调用另一个转换函数,否则会产生未定义的行为。

内容

[编辑] 参数

(无)

[编辑] 返回值

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

[编辑] 注意

如果返回值指向的对象没有被重写,则它等于 nullptr.

在常见的实现中,每个 Pointer(它是一个指针类型)的对象表示都与 void* 的对象表示兼容,因此这些实现通常将 void* 对象存储在 Pointer 对象的存储空间中,无需额外的存储空间。

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

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

[编辑] 示例