Почему в std::span отсутствуют методы cbegin и cend?
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()
(как было предложено PL 247), но это, возможно, сбивает с толку, поэтому решение было просто удалить все члены const и псевдонимы.
В любом слючае, std::cbegin(s)
всегда работает, если вы хотите, чтобы сам контейнер был неизменным (что не является проблемой с span
начать с).
† Технически реализация определена, не требуетсяint const*
, но это полезная выдумка для пояснительных целей.