std::out_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>::operator void**
// 1)
operator Pointer*() const noexcept;
// 2)
operator void**() const noexcept;
将 Pointer 或 void*
对象的地址暴露给通常会重新初始化它的外部函数。
将 *this
转换为存储的 Pointer 对象的地址。
将 *this
转换为 void*
对象的地址。仅当 Pointer 与 void*
不同时,此转换函数才参与重载解析,如果 Pointer 不是指针类型,则程序是错误的。void*
对象的初始值等于存储的 Pointer 对象转换为 void*
的值,对其的任何修改都会影响在析构函数中使用的 Pointer 值。在 *this
的生命周期外访问 void*
对象是未定义行为。一旦对 out_ptr_t 对象调用了这两个转换函数之一,则不得对其调用另一个,否则行为未定义。
参数
(无)
返回值
存储的 Pointer 对象的地址。
满足上述要求的 void*
对象的地址。
备注
如果返回值指向的对象未被重写,则等于 nullptr
。
在常见的实现中,每个是指针类型的 Pointer 的对象表示与其 void*
的对象表示兼容,因此这些实现通常将 void*
对象存储在 Pointer 对象内部,无需额外存储。
- 如果实现启用了基于类型的别名分析(它依赖于严格的别名规则),则可以使用一个对齐良好的 std::byte[sizeof(void*)] 成员子对象,并且两个转换函数都返回隐式创建在该数组内的对象的地址。
- 否则,可以使用 Pointer 成员子对象进行两个转换函数,并且(2)可以直接返回其地址并重新解释为
void**
。
如果 Pointer 是对象表示与 void*
不兼容的指针类型,则可能需要一个额外的 bool 标志来记录是否调用了(1)(或(2))。