В текущей реализации 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 |
В текущей реализации
enumerateимеется неконсистентность относительно константности итераторов обёрнутого контейнера.Если wrapper хранит левую ссылку (
enumerate(lvalue)), то итерирование по const wrapper позволяет менять объекты, и это единственный такой случай. Возникает, поскольку const поверх ссылки не имеет эффекта (https://eel.is/c++draft/dcl.ref#1.sentence-3)userver/universal/include/userver/utils/enumerate.hpp
Line 66 in 3a1962b
Схема вывода типов в perfect forwarding:
После навешивания const на тип:
Во всех остальных случаях константности, будь то хранение контейнера как const (&) или использование const wrapper, элементы изменить невозможно, что не согласуется с описанием функции.
userver/universal/include/userver/utils/enumerate.hpp
Line 84 in 3a1962b