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

Why does std::span lack cbegin and cend methods?

为什么 std::span 只有 beginend 方法而不是常量迭代器对应的 cbegincend? (standard)

我也注意到,我能找到的跨度提案确实有 cbegincend 的定义:P0122R7。为什么被删除?

由于 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() 而只保留 return begin()(如 PL 247 所提议),但这可能令人困惑,因此解决方案的决定是简单地删除所有 const成员和别名。

在任何情况下,如果您希望容器本身不可变(这对于 span 来说不是问题),std::cbegin(s) 始终有效。


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