跳到主要内容

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

示例

本节不完整

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

示例

本节不完整