std::inout_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::inout_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*
对象会导致未定义行为。
一旦这两个转换函数中的一个已在 析构函数 对象上被调用,另一个就不得在上面调用,否则行为是未定义的。
参数
(无)
返回值
存储的 Pointer 对象的地址。
满足上述要求的 void*
对象的地址。
备注
如果返回值所指向的对象未被重写,它将等于构造之前适配的 Smart 对象所持有的值。
在常见的实现中,每一个作为指针类型的 Pointer 的对象表示与其 void*
的对象表示兼容,因此这些实现通常将 void*
对象存储在 Pointer 对象存储空间内,无需额外存储。
- 如果实现启用了基于类型的别名分析(这依赖于严格的别名规则),则可以使用对齐良好的 std::byte[sizeof(void*)] 成员子对象,并且两个转换函数都返回在数组内隐式创建的对象的地址。
- 否则,可以使用 Pointer 成员子对象进行两个转换函数,并且(2)可以直接返回其地址(重新解释为
void**
)。
如果 Pointer 是一个对象表示与 void*
不兼容的指针类型,则可能需要一个额外的 bool 标志来记录是否调用了(1)(或(2))。