跳到主要内容

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

示例

本节不完整

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

示例

本节不完整