为什么 std::span 缺少 cbegin 和 cend 方法?

SWd*_*WdV 7 c++ iterator c++20 std-span

为什么std::span只有beginandend方法而不是它们的常量迭代器对应物cbeginand cend?(标准

我还注意到,我能找到的关于 span 的建议确实对cbeginand有定义cendP0122R7。为什么被删除了?

Bar*_*rry 9

由于LWG3320,这已被删除。

问题是它x.cbegin()应该真正做与 相同的事情std::begin(std::as_const(x)),这std::cbegin(x)就是定义为。

但对于 来说情况并非如此std::span,因为它实际上并不拥有它的元素,因此,它只有浅层常量。鉴于span<int> s;s.cbegin()会给你一个int const*std::cbegin(s)给你一个int*。这是非常不一致的。s.cbegin()本来可以保留而让它返回begin()(如PL 247所提议的那样),但这可以说是令人困惑的,因此决议决定是简单地删除所有 const 成员和别名。

在任何情况下,std::cbegin(s)如果您希望容器本身不可变(从一span开始就不是问题),则始终有效。


从技术上讲,实现已定义,不是必需的int const*,但出于解释目的,这是一个有用的虚构。

  • @SWdV您必须首先将 `span&lt;T&gt;` 本身转换为 `span&lt;T const&gt;` 。 (2认同)