You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指向同一内存的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:19:33