https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111948
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This compiles OK:
namespace std::ranges
{
template<class T, bool Sized = true>
class subrange
{
private:
template<typename, bool = Sized>
struct _Size
{ };
template<typename U>
struct _Size<U, true>
{ U _M_size; };
[[no_unique_address]] _Size<unsigned> _M_size = {};
public:
constexpr
subrange(const T*, unsigned __n)
{
if constexpr (Sized)
_M_size._M_size = __n;
}
constexpr unsigned size() const
{
if constexpr (Sized)
return _M_size._M_size;
else
return 0;
}
};
template<class T>
constexpr int distance(subrange<T, true> const& s)
{ return s.size(); }
} // std::ranges
constexpr int i = 0;
constexpr auto r = std::ranges::subrange(&i, 1);
static_assert(std::ranges::distance(r));