Здравствуйте, sergii.p, Вы писали:
σ>>Дальше же в сообщении компилятора написано, что методы `begin`/`end` не const-qualified.
SP>вопрос — почему. Что такого делает filter, что методы не могут быть const
Так odds -- это же не filter, а take_view. И take_view должен, как минимум, считать, сколько элементов уже было взято из range, над которым работает take_view. Это мутабельная операция.
Здравствуйте, so5team, Вы писали:
S>Здравствуйте, sergii.p, Вы писали:
σ>>>Дальше же в сообщении компилятора написано, что методы `begin`/`end` не const-qualified.
SP>>вопрос — почему. Что такого делает filter, что методы не могут быть const
S>Так odds -- это же не filter, а take_view. И take_view должен, как минимум, считать, сколько элементов уже было взято из range, над которым работает take_view. Это мутабельная операция.
S>Ваш К.О.
S>Так odds -- это же не filter, а take_view. И take_view должен, как минимум, считать, сколько элементов уже было взято из range, над которым работает take_view. Это мутабельная операция.
как чтение количества — mutable???
Здравствуйте, cockRoach, Вы писали:
S>>Так odds -- это же не filter, а take_view. И take_view должен, как минимум, считать, сколько элементов уже было взято из range, над которым работает take_view. Это мутабельная операция. R>как чтение количества — mutable???
Я удивлен тому, что для простого, но неограниченного в размере, view выбирается константный end. Там же вроде как тоже надо считать количество извлеченных элементов.
S>>>Так odds -- это же не filter, а take_view. И take_view должен, как минимум, считать, сколько элементов уже было взято из range, над которым работает take_view. Это мутабельная операция. R>>как чтение количества — mutable???
S>Какого количества?
take_view должен... считать, сколько элементов уже было взято из range... Это мутабельная операция.
Здравствуйте, cockRoach, Вы писали:
R>>>как чтение количества — mutable???
S>>Какого количества? R>
R>take_view должен... считать, сколько элементов уже было взято из range... Это мутабельная операция.
Так это количество нужно считать, а не читать. Тут же мы имеем iota в основе, т.е. range не фиксированного размера. Поэтому take_view не может сразу взять и вычислить два итератора begin/end, которые можно будет сравнивать друг с другом. А придется считать взятые из лежащих ниже range-й элементы при каждом новом чтении.
Ну или поясните свое "чтение количества" чтобы у всех было одинаковое понимание предмета разговора.
Здравствуйте, so5team, Вы писали:
S>Так это количество нужно считать, а не читать. Тут же мы имеем iota в основе, т.е. range не фиксированного размера. Поэтому take_view не может сразу взять и вычислить два итератора begin/end, которые можно будет сравнивать друг с другом. А придется считать взятые из лежащих ниже range-й элементы при каждом новом чтении.
никто не считает end. end — это логическое окончание. Он может быть вообще один для всех коллекций. Его не надо вычислять. Как вариант, можно взять end у "родительского" рэнжа. И опять же никто ничего не меняет и не вычисляет.
begin тоже никто не считает. Просто берут begin у "родительской" коллекции.
Уже ведь писали что iota | take прекрасно иммутабельно работает.
Здравствуйте, sergii.p, Вы писали:
S>>Так это количество нужно считать, а не читать. Тут же мы имеем iota в основе, т.е. range не фиксированного размера. Поэтому take_view не может сразу взять и вычислить два итератора begin/end, которые можно будет сравнивать друг с другом. А придется считать взятые из лежащих ниже range-й элементы при каждом новом чтении.
SP>никто не считает end. end — это логическое окончание. Он может быть вообще один для всех коллекций. Его не надо вычислять. Как вариант, можно взять end у "родительского" рэнжа. И опять же никто ничего не меняет и не вычисляет. SP>begin тоже никто не считает. Просто берут begin у "родительской" коллекции.
Тогда расскажите мне, как должен работать take_view.
Вот если в take_view засовывают range фиксированного размера, то take_view сразу может высчитать значения begin и end: тупо begin_=range.begin(), end_=advance(range.end(), min(range.size(),take_size)). После чего экземпляр take_view будет тупо возвращать свои begin_ и end_ из begin() const и end() const.
А вот если в take_view засовывают безразмерный range, то как take_view должен брать begin (хотя это не должно быть сложно) и, в особенности end?
Ведь если взяли b=take_view.begin(), а потом сделали ++b, то при сравнении нового значения с take_view.end() как-то нужно определить, извлекли ли уже из range все положенные элементы или нет. И откуда это знание возьмется?
SP>Уже ведь писали что iota | take прекрасно иммутабельно работает.
Это вот как раз меня сильно удивляет. В отличии от случая с filter.
Здравствуйте, sergii.p, Вы писали:
SP>Здравствуйте, σ, Вы писали:
σ>>Дальше же в сообщении компилятора написано, что методы `begin`/`end` не const-qualified.
SP>вопрос — почему. Что такого делает filter, что методы не могут быть const
Мне контрибьютор ranges.v3 сказал, что это by design — views могут быть константными и неконстантными — это зависит от реализации, никаких ограничений на стандартные view не накладывается. Видимо, следует изменить свои привычки и не делать переменные типа view константными.
Здравствуйте, sergii.p, Вы писали: SP>Почему так происходит? gcc 11.0.0.20201