为什么std::span
只有begin
和end
方法,而没有它们的常量迭代器对应项CBegin
和cend
? (标准)
我还注意到,我可以找到的span建议确实有cbegin
和cend
的定义: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()
,同时使其返回begin()
(如PL247所建议的),但这可能会引起混淆,因此解决方案决定只是删除所有常量成员和别名。
在任何情况下,如果您希望容器本身是不可变的,那么std::cbegin(s)
总是可以工作的(这不是span
的问题)。
技术上,实现定义,不需要int const*
,但这是一个有用的假设,用于解释。