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?