命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | 内存‎ | out ptr t
 
 
内存管理库
(仅作说明*)
未初始化内存算法
(C++17)
(C++17)
(C++17)
受约束的未初始化
内存算法
C 库

分配器
内存资源
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化存储
(直到 C++20*)
(直到 C++20*)
显式生命周期管理
 
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 起)

将 `Pointer` 或 void* 对象的地址暴露给外部函数,该函数通常会重新初始化它。

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))。

[编辑] 示例