在某种成都上,string-viewspanrange::views在功能上有所相同之处。他们都是对某个连续内存区域的映射,同时并不owner对象。它们的区别主要是在于使用的意图以及功能的多寡上面。

  • string-view是一个std::string的只读的视图。从某种意义上,我们理解为std::string::c_str的一个面向对象的readonly的封装吧。差不多就是这个意思。

  • std::span要更通用一些,它不再局限于std::string了。可以只想其他的对象。并且,它即可以是只读的,也可以是读写的。span<T>span<const T>的区别。另外,在C++23中还有std::mdspan。多维而已,其他的和span在理念上是相通的。

  • range::views,就更广泛了。但是它的核心思想是lazy evaluation,而且它提供了filtertransform等一票函数,这才是它的重点。

按照我的理解,string-view也好,span也好,应该是传统的指针的替代物,更多的是作为函数的参数使用的,避免数据拷贝的成本;而ranges::views不是,它就是一个实体,本身就负责对数据做操作,而且还支持惰性惰性计算。

不过,目前来说,编辑器对ranges的支持实在是太差了。写个views一片飘红,编译一下啥问题都没有。