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