std::ranges::dangling
Von cppreference.com
| 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
Führen Sie diesen Code aus
#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) | |
| (C++20) |
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) |