std::ranges::safe_iterator_t, std::ranges::safe_subrange_t
From cppreference.com
                    
                                        
                    
                    
                                                            
                    |   Defined in header  <ranges>
  | 
||
|   template<Range R> using safe_iterator_t = std::conditional_t<__ForwardingRange<R>,  | 
(1) | (since C++20) | 
|   template<Range R> using safe_subrange_t = std::conditional_t<__ForwardingRange<R>,  | 
(2) | (since C++20) | 
1) Same as ranges::iterator_t when 
R models exposition-only concept __ForwardingRange, otherwise yields ranges::dangling instead.2) Similar to (1), but it yields a specialization of ranges::subrange when the the same condition is met.
These two alias templates are used by some constrained algorithms to avoid returning potentially dangling iterators or views.
See also
   a placeholder type indicating that an iterator or a subrange should not be returned since it would be dangling  (class)  |