std::to_address是C++20引入的安全统一获取裸指针的工具函数,支持原生指针、智能指针和连续迭代器,对非连续迭代器SFINAE排除,避免未定义行为。

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 排除),编译失败——这是有意设计,防止误用
典型用法示例
✅ 安全获取智能指针的裸地址:
标签: c++ 裸指针 工具 ai proxy 区别 编译错误 为什么 red
还木有评论哦,快来抢沙发吧~