提问者:小点点

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


为什么std::span只有beginend方法,而没有它们的常量迭代器对应项CBegincend? (标准)

我还注意到,我可以找到的span建议确实有cbegincend的定义:P0122R7。 为什么被移除?


共1个答案

匿名用户

这是由于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*,但这是一个有用的假设,用于解释。