指向同一内存的std::span对象及迭代器比较的合法性问询
指向同一内存的std::span对象及迭代器比较的合法性问询
没问题,这种迭代器比较操作完全是合法且行为明确的!
咱们先看你给出的这段代码:
#include <span> #include <cassert> int main() { int arr[5]{1,2,3,4,5}; std::span s1{arr}; std::span s2{arr}; assert(s1.begin() == s2.begin()); assert(s1.end() == s2.end()); assert(s1.begin() + s1.size() == s2.end()); }
这里面的三个断言都会顺利通过,原因很简单:std::span的迭代器本质上就是指向底层连续内存的指针(对于数组这类连续容器来说)。当s1和s2都指向同一个数组arr时,它们的begin()返回的迭代器指向的是数组的第一个元素地址,end()指向的是数组末尾的下一个位置——这两个span的迭代器对应的地址完全一致,所以相等比较的结果自然是true。
从C++标准的角度来讲,std::span的迭代器属于随机访问迭代器范畴,只要两个迭代器指向的是同一个序列的元素(或序列末尾的哨兵位置),那么它们之间的相等、不等比较,以及迭代器加减偏移后的比较,都是定义良好的。哪怕是不同的std::span对象,只要它们关联的是同一块连续内存区域,迭代器之间的比较就没有任何问题。
备注:内容来源于stack exchange,提问作者Ahmed AEK
相关产品推荐
相关产品推荐

