Почему в std::span отсутствуют методы cbegin и cend?

Почему std::span иметь только begin а также end методы, а не их постоянные аналоги итератора cbegin а также cend? (стандарт)

Я также заметил, что в предложениях для диапазона, которые я смог найти, действительно есть определение для cbegin а также cend: 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()(как было предложено PL 247), но это, возможно, сбивает с толку, поэтому решение было просто удалить все члены const и псевдонимы.

В любом слючае, std::cbegin(s) всегда работает, если вы хотите, чтобы сам контейнер был неизменным (что не является проблемой с span начать с).


Технически реализация определена, не требуетсяint const*, но это полезная выдумка для пояснительных целей.

Другие вопросы по тегам