std::span生成的迭代器能否在对应span实例销毁后继续使用?
问题答复
核心结论
std::span实例被销毁后,其生成的迭代器不会因为span本身销毁而失效,迭代器的有效性仅和span所引用的底层存储的生命周期、状态有关。
原理说明
std::span是无所有权的轻量视图类型,所有主流标准库实现中,span的迭代器本质是对底层原始指针的简单封装,迭代器本身的存活不依赖span对象的生命周期。只要底层存储(你代码中vector的底层数组)没有被销毁、没有发生内存重分配、对应元素没有被析构,从span生成的迭代器就可以正常使用。
你的示例代码是合法可正常运行的,完全符合你的需求:
#include <iostream> #include <span> #include <vector> template <size_t N> struct my_view { std::vector<int> vec; auto as_span() { return std::span<int[N]>((int(*)[N])vec.data(), vec.size() / N); } auto begin() { return as_span().begin(); } auto end() { return as_span().end(); } }; int main() { std::vector vec {1, 2, 3, 4, 5, 6}; my_view<2> pairs {std::move(vec)}; for (auto pair : pairs) { std::cout << pair[0] << " " << pair[1] << std::endl; } my_view<3> triplets {std::move(pairs.vec)}; for (auto triplet : triplets) { std::cout << triplet[0] << " " << triplet[1] << " " << triplet[2] << std::endl; } return 0; }
注意事项
- 该实现要求vec的大小必须是N的整数倍,否则会触发未定义行为
- 如果后续对vec执行push_back、resize等可能触发内存重分配的操作,之前获取的迭代器会失效
内容的提问来源于stack exchange,提问作者ofo
相关产品推荐
相关产品推荐

