75679


std::ranges::filter_viewがconstだとstd::ranges::rangeを満たさなくなるようなのですが、その理由は何なのでしょうか？

[code]

    #include <ranges>
    using namespace std::ranges;
    static_assert(range<drop_view<views::all_t<int(&)[10]>>>);
    static_assert(range<const drop_view<views::all_t<int(&)[10]>>>);
    static_assert(range<take_view<views::all_t<int(&)[10]>>>);
    static_assert(range<const take_view<views::all_t<int(&)[10]>>>);
    static_assert(range<transform_view<views::all_t<int(&)[10]>, bool(*)(int)>>);
    static_assert(range<const transform_view<views::all_t<int(&)[10]>, bool(*)(int)>>);
    static_assert(range<filter_view<views::all_t<int(&)[10]>, bool(*)(int)>>);
    // static_assert(range<const filter_view<views::all_t<int(&)[10]>, bool(*)(int)>>);  // error
    
[/code]

それ以外のviewはconstでも平気なようなのですが。


CC BY-SA 4.0
2021-05-04T11:03:58.157
75671
2021-05-06T07:44:05.230
37855
question
c++
C++20でfilter_viewがconstの時にrangeコンセプトを満たさないのは何故？


> std::ranges::filter_viewがconstだとstd::ranges::rangeを満たさなくなる

直接理由は「[`std::ranges::filter_view`クラステンプレート](https://timsong-
cpp.github.io/cppwp/n4861/range.filter.view)がconst修飾された`begin`/`end`メンバ関数を提供しない」ためです。

> それ以外のviewはconstでも平気

[`drop_view`](https://timsong-cpp.github.io/cppwp/n4861/range.drop.view),
[`take_view`](https://timsong-cpp.github.io/cppwp/n4861/range.take.view),
[`transform_view`](https://timsong-
cpp.github.io/cppwp/n4861/range.transform.view)はいずれもconst修飾／非修飾の`begin`/`end`メンバ関数を提供します。

* * *

> その理由は何なのでしょうか？

C++20
Ranges標準ライブラリの元となった[Range-v3ライブラリのissue#385](https://github.com/ericniebler/range-v3/issues/385)を参照ください。

（分量が多く斜め読みしかしていないので参考までに...）`std::range`コンセプトを満たすには`begin`/`end`イテレータ取得操作に[償却定数時間(amortized
constant)を要求](https://timsong-
cpp.github.io/cppwp/n4861/range.range#3.2)されますが、`filter_view`の場合はスキップされる要素が存在するために`const`バージョンを合理的に実現できないと設計判断したようです。

**追記：**[C++20 Range Adaptors and Range
Factories](https://brevzin.github.io/c++/2021/02/28/ranges-reference/)
ではRangeの "const-iterable" という概念で整理されています。またC++20 Ranges Library導入時の提案文書
[P0789R3](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0789r3.pdf)
§1.3.1 The `filter` adaptor is not `const`-iterable もあわせて参照ください。


CC BY-SA 4.0
2021-05-05T05:35:08.397
75679
2021-05-06T07:44:05.230
2021-05-06T07:44:05.230
49
49
75671
answer