【发布时间】:2021-10-15 06:27:18
【问题描述】:
反过来说,std::span 迭代器在 span 实例被销毁后是否失效?
我有一个向量需要用不同的布局进行迭代。我正在尝试使用std::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;
}
【问题讨论】:
-
我无法找到与此相关的规范性文本。从理论上讲,它们应该能够比跨度长(因为跨度本身除了指向底层序列的指针和动态范围的大小之外不包含任何数据成员)
标签: c++ iterator c++20 lifetime std-span