[PATCH v2 2/2] libstdc++: Make ref_view<R> statically sized if R is statically sized

Hewill Kang hewillk@gmail.com
Wed Mar 18 16:55:30 GMT 2026


I wrote a similar paper, namely
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3928r0.html
If you want to enhance ref_view::size, then I think ref_view::empty should
also be enhanced, just like the paper did.

Tomasz Kamiński <tkaminsk@redhat.com> 於 2026年3月19日週四 上午12:31寫道:

> If the referenced range is statically sized, instead of referencing a
> pointer whose value is not know at compile time, we return
> integral_constant<range_difference_t<_Rg>, ranges::size(__rg)>::value.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/ranges (ref_view::size()): Return constant for
> statically
>         sized ranges, even if pointed object is unknown.
>         * testsuite/23_containers/inplace_vector/cons/from_range_neg.cc:
>         Expect errors from ref_view of array examples.
> ---
> v2 uses integral_constant to produce a value of ranges size.
>
>  libstdc++-v3/include/std/ranges                | 18 +++++++++++++++++-
>  .../inplace_vector/cons/from_range_neg.cc      |  6 ++----
>  2 files changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/ranges
> b/libstdc++-v3/include/std/ranges
> index 95e0109a10c..71ab0d674c9 100644
> --- a/libstdc++-v3/include/std/ranges
> +++ b/libstdc++-v3/include/std/ranges
> @@ -1395,7 +1395,23 @@ namespace views::__adaptor
>
>        constexpr auto
>        size() const requires sized_range<_Range>
> -      { return ranges::size(*_M_r); }
> +      {
> +#if __cplusplus > 202302L
> +       if constexpr (__static_sized_range<_Range>)
> +         {
> +           auto __conjure_size_constant
> +             = [](_Range& __rg)
> +               {
> +                 return integral_constant<
> +                          range_difference_t<_Range>,
> +                          ranges::size(__rg)>();
> +               };
> +            return decltype(__conjure_size_constant(*_M_r))::value;
> +         }
> +        else
> +#endif
> +         return ranges::size(*_M_r);
> +      }
>
>        constexpr auto
>        data() const requires contiguous_range<_Range>
> diff --git
> a/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range_neg.cc
> b/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range_neg.cc
> index cf87129da51..15fd7b5c285 100644
> ---
> a/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range_neg.cc
> +++
> b/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range_neg.cc
> @@ -57,14 +57,12 @@ test_all()
>    test_one(a1); // { dg-error "from here" }
>    test_one(s1); // { dg-error "from here" }
>    test_one(s5 | std::views::adjacent<5> | std::views::elements<0>); // {
> dg-error "from here" }
> -  // ref_view is not statically sized due pointer dereference
> -  test_one(a5 | std::views::adjacent<7> | std::views::elements<0>);
> +  test_one(a5 | std::views::adjacent<5> | std::views::elements<0>); // {
> dg-error "from here" }
>
>    test_five(a5); // { dg-error "from here" }
>    test_five(s5); // { dg-error "from here" }
>    test_five(s7 | std::views::adjacent<3> | std::views::elements<0>); // {
> dg-error "from here" }
> -  // ref_view is not statically sized due pointer dereference
> -  test_five(a7 | std::views::adjacent<3> | std::views::elements<0>);
> +  test_five(a7 | std::views::adjacent<3> | std::views::elements<0>); // {
> dg-error "from here" }
>  }
>
>  // { dg-error "static assertion failed" "" { target *-*-* } 0 }
> --
> 2.53.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260319/44f3e591/attachment.htm>


More information about the Libstdc++ mailing list