ODR violation in ranges

Jonathan Wakely jwakely@redhat.com
Wed Mar 11 10:26:09 GMT 2020


On 11/03/20 06:08 -0400, Nathan Sidwell wrote:
>Jonathan,
>the ranges header contains code like:
>    inline constexpr __adaptor::_RangeAdaptorClosure all
>      = [] <viewable_range _Range> (_Range&& __r)
>      {
> if constexpr (view<decay_t<_Range>>)
>   return std::forward<_Range>(__r);
> else if constexpr (requires { ref_view{std::forward<_Range>(__r)}; })
>   return ref_view{std::forward<_Range>(__r)};
> else
>   return subrange{std::forward<_Range>(__r)};
>      };
>
>(line 1236)
>
>When you strip away all the templateyness, you have:
>
>
>inline constexpr auto all = [] () {};
>
>
>That's an ODR violation -- the initializers in different TUs are not 
>the same!
>
>As you can guess, I can't turn this into a header unit (well, I can, 
>but merging duplicates complains at you)

CC libstdc++@ and Patrick.

I did wonder if using lambdas for those global variables would be OK.

I think we'll need a new class template for each view adaptor, rather
than using the _RangeAdaptorClosure to hold a closure.

Patrick, can you look into that please?



More information about the Libstdc++ mailing list