Namensräume
Varianten
Aktionen

std::ranges::dangling

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
struct dangling;
(seit C++20)

dangling ist ein Platzhaltertyp und ein leere Klassentyp, der zusammen mit den Template-Aliassen ranges::borrowed_iterator_t und ranges::borrowed_subrange_t verwendet wird.

Wenn einige eingeschränkte Algorithmen, die normalerweise einen Iterator oder eine Teilmenge eines range zurückgeben, ein bestimmtes rvalue range Argument annehmen, das borrowed_range nicht modelliert, wird stattdessen dangling zurückgegeben, um die Rückgabe potenziell ungültiger Ergebnisse zu vermeiden.

Inhalt

[bearbeiten] Member-Funktionen

std::ranges::dangling::dangling

constexpr dangling() noexcept = default;
(1)
template<class... Args>
constexpr dangling(Args&&...) noexcept { }
(2)
1) dangling ist trivial standardmäßig konstruierbar.
2) dangling kann aus Argumenten beliebiger Anzahl und beliebigen nicht-void Typs konstruiert werden. Die Konstruktion hat selbst keine Nebenwirkungen.

Mit anderen Worten, nach dem Ersetzen des Typs (z. B. eines Iterator-Typs) in einer wohlgeformten Nicht-Aggregat-Initialisierung durch dangling ist die resultierende Initialisierung ebenfalls wohlgeformt.

[bearbeiten] Beispiel

#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'
}

Ausgabe

1 'a'

[bearbeiten] Siehe auch

ermittelt den Iterator- oder subrange-Typ eines borrowed_range
(Alias-Template)[edit]
spezifiziert, dass ein Typ ein range ist und Iteratoren, die aus einem Ausdruck davon erhalten werden, sicher zurückgegeben werden können, ohne Gefahr des Hängens
(Konzept) [edit]