C++20 通过迭代器获取原始指针的标准模板函数查询
答案
你要找的C++20标准库模板函数是std::to_address。
该函数解决的问题
你之前常用的&*it写法存在两类明显缺陷:
- 尾后迭代器(如你举例的
myVec.end())解引用本身属于未定义行为,开启迭代器调试的STL实现(比如MSVC的迭代器调试模式、libstdc++的_GLIBCXX_DEBUG模式)会直接触发断言报错 - 如果迭代器的
operator*返回的是代理对象而非元素的左值引用,&*it也无法获取到正确的元素原始地址
使用说明
std::to_address定义在<memory>头文件中,无需手动解引用迭代器即可安全获取对应原始指针,对标准库迭代器和自定义合规迭代器都能生效,也支持传入尾后迭代器的场景。你需要获取尾后迭代器对应指针时,直接写std::to_address(myVec.end())即可,不会触发迭代器调试的错误。
内容的提问来源于stack exchange,提问作者Bonita Montero
相关产品推荐
相关产品推荐

