std::out_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>::operator void**
来自cppreference.com
| (1) | (C++23 起) (C++26 起为 constexpr) |
|
| (2) | (C++23 起) | |
暴露 Pointer 或 void* 对象的地址给一般会重初始化它的外来函数。
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_cast 成void**的其地址。
如果 Pointer 是对象表示与 void* 的不兼容的指针类型,那么可能需要额外的 bool 标志记录是否调用了 operator Pointer*(或 operator void**)。
示例
| 本节未完成 原因:暂无示例 |