10

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

我还注意到,我能找到的跨度提案确实有一个定义cbeginand cend: P0122R7。为什么被移除?

4

1 回答 1

11

由于LWG3320 ,这已被删除。

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

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

在任何情况下,std::cbegin(s)如果您希望容器本身是不可变的(一span开始就不是问题),它总是可以工作。


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

于 2020-07-06T14:07:21.150 回答