std::inout_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::inout_ptr_t<Smart,Pointer,Args...>::operator void**
来自 cppreference.com
< cpp | memory | inout ptr t
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
不是指针类型,则程序将形成不正确。存储的
Pointer
对象转换为 void* 后的值将成为 void* 对象的初始值,对其进行的任何修改都会影响 析构函数 中使用的 Pointer
值。在 *this 的生命周期之外访问 void* 对象具有未定义的行为。一旦对 inout_ptr_t
对象调用了这两个转换函数中的一个,就不应再对其调用另一个,否则行为将是不确定的。
内容 |
[编辑] 参数
(无)
[编辑] 返回值
1) 存储的
Pointer
对象的地址。2) 满足上述要求的 void* 对象的地址。
[编辑] 说明
如果返回值指向的对象未被重写,则它等于构造之前由适配的 Smart
对象持有的值。
在常见的实现中,每个 Pointer
(它是指针类型)的对象表示法都与 void* 的对象表示法兼容,因此这些实现通常将 void* 对象存储在 Pointer
对象的存储空间内,无需额外的存储空间
- 如果实现启用了基于类型的别名分析(依赖于 严格别名规则),则可以使用正确对齐的 std::byte[sizeof(void*)] 成员子对象,并且这两个转换函数都返回在数组中 隐式创建 的对象的地址。
- 否则,
Pointer
成员子对象可用于这两个转换函数,而 (2) 可以直接返回其地址 reinterpret_cast 为 void** 。
如果 Pointer
是一个指针类型,其对象表示法与 void* 的对象表示法不兼容,则可能需要一个额外的 bool 标志来记录是否已调用 (1)(或 (2))。
[编辑] 示例
本节内容不完整 原因:没有示例 |