- Tumbleweed 2024.07.05-1.3
 - Leap-16.0
 - Leap-15.6
 
| std::ranges::dangling(3) | C++ Standard Libary | std::ranges::dangling(3) | 
NAME¶
std::ranges::dangling - std::ranges::dangling
Synopsis¶
 Defined in header <ranges>
  
   struct dangling; (since C++20)
  
   dangling is a placeholder type and an empty class type, used together with
    the
  
   template aliases ranges::borrowed_iterator_t and
  ranges::borrowed_subrange_t.
  
   When some constrained algorithms that usually return an iterator or a
    subrange of a
  
   range take a particular rvalue range argument that does not model
    borrowed_range,
  
   dangling will be returned instead to avoid returning potentially dangling
    results.
Member functions¶
std::ranges::dangling::dangling
  
   constexpr dangling() noexcept = default; (1)
  
   template<class... Args> (2)
  
   constexpr dangling(Args&&...) noexcept { }
  
   1) dangling is trivially default constructible.
  
   2) dangling can be constructed from arguments of arbitrary number and
    arbitrary
  
   non-void type. The construction does not have any side-effect itself.
  
   In other words, after replacing the type (e.g. an iterator type) in a
    well-formed
  
   non-aggregate initialization with dangling, the resulting initialization is
    also
  
   well-formed.
Example¶
// Run this code
  
   #include <algorithm>
  
   #include <array>
  
   #include <iostream>
  
   #include <ranges>
  
   #include <type_traits>
  
   #include <string_view>
  
   int main()
  
   {
  
   auto get_array_by_value = [] { return std::array{0, 1, 0, 1}; };
  
   auto dangling_iter = std::ranges::max_element(get_array_by_value());
  
   static_assert(std::is_same_v<std::ranges::dangling,
    decltype(dangling_iter)>);
  
   // std::cout << *dangling_iter << '\n'; // compilation error: no
    match for 'operator*'
  
   // (operand type is 'std::ranges::dangling')
  
   auto get_persistent_array = []() -> const std::array<int, 4>& {
  
   static constexpr std::array a{0, 1, 0, 1};
  
   return a;
  
   };
  
   auto valid_iter = std::ranges::max_element(get_persistent_array());
  
   static_assert(!std::is_same_v<std::ranges::dangling,
    decltype(valid_iter)>);
  
   std::cout << *valid_iter << ' '; // 1
  
   auto get_string_view = [] { return std::string_view{"alpha"}; };
  
   auto valid_iter2 = std::ranges::min_element(get_string_view());
  
   // OK: std::basic_string_view models borrowed_range
  
   static_assert(!std::is_same_v<std::ranges::dangling,
    decltype(valid_iter2)>);
  
   std::cout << '\'' << *valid_iter2 << '\'' << '\n'; //
    'a'
  
   }
Output:¶
1 'a'
See also¶
 ranges::borrowed_iterator_t obtains iterator type or subrange
    type of a
  
   ranges::borrowed_subrange_t borrowed_range
  
   (C++20) (alias template)
  
   specifies that a type is a range and iterators obtained
  
   ranges::borrowed_range from an expression of it can be safely returned
    without
  
   (C++20) danger of dangling
  
   (concept)
| 2024.06.10 | http://cppreference.com |