Namensräume
Varianten
Aktionen

std::unreachable_sentinel_t, std::unreachable_sentinel

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
unreachable_sentinel_tunreachable_sentinel
(C++20)(C++20)
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
Definiert in Header <iterator>
struct unreachable_sentinel_t;
(1) (seit C++20)
inline constexpr unreachable_sentinel_t unreachable_sentinel{};
(2) (seit C++20)
1) unreachable_sentinel_t ist ein leeres Klassentyp, der verwendet werden kann, um die „obere Grenze“ eines unbegrenzten Intervalls zu bezeichnen.
2) unreachable_sentinel ist eine Konstante vom Typ unreachable_sentinel_t.

Inhalt

[bearbeiten] Nicht-Member-Funktionen

operator==
(C++20)
vergleicht ein unreachable_sentinel_t mit einem Wert eines beliebigen weakly_incrementable-Typs
(function template)

operator==(std::unreachable_sentinel_t)

template<std::weakly_incrementable I>

friend constexpr bool operator==( unreachable_sentinel_t, const I& ) noexcept

{ return false; }
(seit C++20)

unreachable_sentinel_t kann mit jedem weakly_incrementable-Typ verglichen werden und das Ergebnis ist immer false.

Diese Funktion-Template ist für gewöhnliche unqualifizierte oder qualifizierte Lookups nicht sichtbar und kann nur durch argumentabhängige Suche gefunden werden, wenn std::unreachable_sentinel_t eine zugehörige Klasse der Argumente ist.

[bearbeiten] Beispiel

#include <algorithm>
#include <cstddef>
#include <iostream>
#include <iterator>
 
template<class CharT>
constexpr std::size_t strlen(const CharT* s)
{
    return std::ranges::find(s, std::unreachable_sentinel, CharT{}) - s;
}
 
template<class CharT>
constexpr std::size_t find_first(const CharT* haystack, const CharT* needle)
{
    const char* needle_end = needle + strlen(needle);
    // search(begin, unreachable_sentinel) is usually more efficient than
    // search(begin, end) due to one less comparison per cycle.
    // But "needle" MUST BE PRESENT in the "haystack", otherwise the call
    // is UB (which is a compile-time error in constexpr context).
    auto found = std::ranges::search(haystack, std::unreachable_sentinel,
                                     needle, needle_end);
    return found.begin() - haystack;
}
 
int main()
{
    static_assert(strlen("The quick brown fox jumps over a lazy dog.") == 42);
    static_assert(find_first("unsigned short int", "short") == 9);
//  static_assert(find_first("long int", "float")); // compile-time error
}

[bearbeiten] Siehe auch

ein view, der eine Sequenz aus aufeinanderfolgenden Inkrementierungen eines Anfangswerts besteht
(Klassen-Template) (Customization Point Objekt)[edit]