template<range _Range>
using sentinel_t = decltype(ranges::end(std::declval<_Range&>()));
-#if __cplusplus > 202002L
+#if __glibcxx_ranges_as_const // >= C++23
template<range _Range>
using const_iterator_t = const_iterator<iterator_t<_Range>>;
concept common_range
= range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>;
-#if __cplusplus > 202002L
+#if __glibcxx_ranges_as_const // >= C++23
template<typename _Tp>
concept constant_range
= input_range<_Tp> && std::__detail::__constant_iterator<iterator_t<_Tp>>;
namespace __access
{
-#if __cplusplus > 202020L
+#if __glibcxx_ranges_as_const // >= C++23
template<typename _Range>
constexpr auto&
__possibly_const_range(_Range& __r) noexcept
struct _CBegin
{
-#if __cplusplus > 202002L
+#if __glibcxx_ranges_as_const // >= C++23
template<__maybe_borrowed_range _Tp>
[[nodiscard]]
constexpr auto
struct _CEnd final
{
-#if __cplusplus > 202002L
+#if __glibcxx_ranges_as_const // >= C++23
template<__maybe_borrowed_range _Tp>
[[nodiscard]]
constexpr auto
struct _CRBegin
{
-#if __cplusplus > 202002L
+#if __glibcxx_ranges_as_const // >= C++23
template<__maybe_borrowed_range _Tp>
[[nodiscard]]
constexpr auto
struct _CREnd
{
-#if __cplusplus > 202002L
+#if __glibcxx_ranges_as_const // >= C++23
template<__maybe_borrowed_range _Tp>
[[nodiscard]]
constexpr auto
struct _CData
{
-#if __cplusplus > 202002L
+#if __glibcxx_ranges_as_const // >= C++23
template<__maybe_borrowed_range _Tp>
[[nodiscard]]
constexpr const auto*