首页 > 后端开发 > C++ > 正文

c++中的std::to_address是什么_c++ C++20获取裸指针的安全方式

冰火之心
发布: 2025-12-13 21:12:08
原创
764人浏览过
std::to_address是C++20引入的安全统一获取裸指针的工具函数,支持原生指针、智能指针和连续迭代器,对非连续迭代器SFINAE排除,避免未定义行为。

c++中的std::to_address是什么_c++ c++20获取裸指针的安全方式

std::to_address 是 C++20 引入的一个工具函数,用于**安全地从任意指针类型(包括智能指针、迭代器、自定义指针类)获取其底层裸指针(raw pointer)**,且在编译期或运行期避免未定义行为(UB),尤其适用于泛型代码中统一处理“可解引用对象”。

为什么需要 std::to_address?

在 C++17 及之前,很多人直接写 ptr.get()(对 std::unique_ptr)、&*it(对迭代器)、ptr.operator->() 等,但这些方式:

  • 不通用:每种指针类型写法不同,模板里难统一
  • 不安全:&*it 对空迭代器或 past-the-end 迭代器是未定义行为
  • 不标准:operator-> 可能返回代理对象,不能直接取地址

std::to_address 的核心行为

它根据参数类型自动选择安全路径:

  • 若参数是原生指针(如 T*),直接返回该指针
  • 若参数是满足 std::pointer_traits 要求的指针类(如 std::unique_ptr, std::shared_ptr),调用其 to_address() 静态成员(C++20 要求该成员存在)或回退到 ptr.get()
  • 若参数是迭代器(如 std::vector::iterator),仅当它是 contiguous_iterator(连续迭代器)时才允许转换,并调用 std::to_address(it) → 实际等价于 std::addressof(*it)(注意:不是 &*it!)
  • 对非连续迭代器(如 std::list::iterator),std::to_address 不参与重载(SFINAE 排除),编译失败——这是有意设计,防止误用

典型用法示例

✅ 安全获取智能指针的裸地址:

DeepBrain
DeepBrain

AI视频生成工具,ChatGPT +生成式视频AI =你可以制作伟大的视频!

DeepBrain 146
查看详情 DeepBrain

立即学习C++免费学习笔记(深入)”;

```cpp
#include
#include
#include

auto ptr = std::make_unique(42);
int* raw = std::to_address(ptr); // ✅ 安全,等价于 ptr.get()

std::vector v = {1,2,3};
auto it = v.begin();
int* p = std::to_address(it); // ✅ 连续迭代器,安全

// ❌ 编译错误:std::list::iterator 不是 contiguous_iterator
// std::list l{1,2};
// auto lit = l.begin();
// int* bad = std::to_address(lit); // SFINAE 失败
```

和 &*it 的关键区别

&*it 是常见但危险的写法:

  • 要求 it 必须可解引用(即不能是 end()、未初始化、或空容器的 begin())
  • 对某些代理迭代器(如 std::vector<bool>::iterator</bool>),*it 返回临时 proxy 对象,&*it 取其地址是悬垂指针
  • std::to_address(it) 在连续迭代器上使用 std::addressof(*it),能正确处理 proxy 类型,且标准保证其安全语义

基本上就这些。它不是万能的,也不替代你理解指针生命周期,但在泛型内存操作(比如自定义分配器、零拷贝序列化、与 C API 交互)中,是 C++20 推荐的、类型安全的“取裸地址”入口点。

以上就是c++++中的std::to_address是什么_c++ C++20获取裸指针的安全方式的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号