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?

Reply via email to