Skip to content

Inconsistency in enumerate related to const #1193

@ddvamp

Description

@ddvamp

В текущей реализации enumerate имеется неконсистентность относительно константности итераторов обёрнутого контейнера.

Если wrapper хранит левую ссылку (enumerate(lvalue)), то итерирование по const wrapper позволяет менять объекты, и это единственный такой случай. Возникает, поскольку const поверх ссылки не имеет эффекта (https://eel.is/c++draft/dcl.ref#1.sentence-3)

constexpr IteratorWrapper<IteratorTypeOf<const Container>> begin() const {

Схема вывода типов в perfect forwarding:

value rref lref
non-const T T T &
const T const T const T const &

После навешивания const на тип:

value rref lref
non-const T const T const T & (!!!)
const T const T const T const &

Во всех остальных случаях константности, будь то хранение контейнера как const (&) или использование const wrapper, элементы изменить невозможно, что не согласуется с описанием функции.

/// of index and (!!!)non-const reference to element(it seems impossible to make

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions