为什么std::span只有begin和end方法而不是它们的常量迭代器对应物cbegin和cend?(标准)
我还注意到,我能找到的跨度提案确实有一个定义cbeginand cend: P0122R7。为什么被移除?
由于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*的,但这是用于解释目的的有用虚构。