Namespaces
Variants

std::out_ptr_t<Smart,Pointer,Args...>:: operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>:: operator void**

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
std::out_ptr_t
Member functions
out_ptr_t::operator Pointer* out_ptr_t::operator void**
Non-member functions
operator Pointer * ( ) const noexcept ;
(1) (自 C++23 起)
operator void ** ( ) const noexcept ;
(2) (自 C++23 起)

Pointer void * 对象的地址暴露给外部函数,该函数通常会重新初始化该地址。

1) * this 转换为所存储 Pointer 对象的地址。
2) * this 转换为 void * 对象的地址。此转换函数仅在 Pointer void * 类型不同时参与重载决议,且当 Pointer 不是指针类型时程序非良构。
void * 对象的初始值等于存储的 Pointer 对象转换为 void * 后的值,对其进行的任何修改都会影响 析构函数 中使用的 Pointer 值。在 * this 生命周期之外访问 void * 对象将导致未定义行为。

一旦在 out_ptr_t 对象上调用了这两个转换函数之一,就不应再对其调用另一个函数,否则将导致未定义行为。

目录

参数

(无)

返回值

1) 已存储 Pointer 对象的地址。
2) 满足前述要求的 void * 对象的地址。

注释

如果返回值所指向的对象未被重写,则其等于 nullptr

在常见实现中,每个作为指针类型的 Pointer 的对象表示与 void * 的对象表示兼容,因此这些实现通常将 void * 对象存储在 Pointer 对象的存储空间内,无需额外存储:

  • 如果实现启用了基于类型的别名分析(依赖于 严格别名规则 ),则可以使用正确对齐的 std:: byte [ sizeof ( void * ) ] 成员子对象,且两个转换函数都返回数组内 隐式创建 的对象的地址。
  • 否则,可以使用 Pointer 成员子对象来实现两个转换函数,且 (2) 可以直接将其地址通过 reinterpret_cast 转换为 void ** 后返回。

如果 Pointer 是指针类型,其对象表示与 void * 不兼容,则可能需要额外的 bool 标志来记录是否已调用 (1) (或 (2) )。

示例