C++中用元素指针减去std::span迭代器获取合法索引的写法是否有效?
结论
这段代码完全合法且行为定义明确,不存在未定义行为。
原因解释
- 首先
std::span/absl::Span的operator[]返回对应位置元素的左值引用,&(subspan[i])会得到指向该元素的合法T*类型指针。 - 其次
span的迭代器属于连续迭代器,C++标准明确规定:针对指向同一连续存储数组的连续迭代器和指针,二者的减法运算结果等价于对应内存地址的偏移量除以单个元素的大小,也就是元素在数组中的下标差。你提到的「-运算符左侧为指针时迭代器会转换为对应指针值」的前提完全成立,连续迭代器的设计就是符合这个语义的。 - 你已经明确
subspan和fullspan是同一份底层数组的视图、且fullspan覆盖整个数组,因此subspan[i]必然属于fullspan覆盖的元素范围,地址相减得到的偏移量完全合法,可以直接作为size_table的下标使用。
优化建议
如果想要进一步提升代码可读性、避免依赖迭代器的隐式转换,可以把写法改成更直观的版本:
int size = size_table[&(subspan[i]) - fullspan.data()];
fullspan.data()直接返回指向fullspan首元素的指针,和原来的写法行为完全一致,更不容易产生误解。
内容的提问来源于stack exchange,提问作者matthias_buehlmann
相关产品推荐
相关产品推荐

