Namensräume
Varianten
Aktionen

std::common_iterator<I,S>:operator*, ->

Von cppreference.com
 
 
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
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)
 
 
constexpr decltype(auto) operator*();
(1) (seit C++20)
constexpr decltype(auto) operator*() const
    requires /*dereferenceable*/<const I>;
(2) (seit C++20)
constexpr auto operator->() const
    requires /* siehe Beschreibung */;
(3) (seit C++20)
Hilfstypen
class /*proxy*/ {

    std::iter_value_t<I> keep_;
    constexpr proxy(std::iter_reference_t<I>&& x)
        : keep_(std::move(x)) {}
public:
    constexpr const std::iter_value_t<I>* operator->() const noexcept {
        return std::addressof(keep_);
    }

};
(4) (nur Exposition*)

Gibt Zeiger oder Referenz auf das aktuelle Element zurück, oder einen Proxy, der es enthält.

Das Verhalten ist undefiniert, wenn das zugrundeliegende std::variant-Mitgliedsobjekt var kein Objekt vom Typ I enthält, d. h. std::holds_alternative<I>(var) gleich false ist.

Sei it der Iterator vom Typ I, der von var gehalten wird, d. h. std::get<I>(var).

1,2) Gibt das Ergebnis der Dereferenzierung von it zurück.
3) Gibt einen Zeiger oder Iterator auf das aktuelle Element zurück, oder einen Proxy, der es enthält.
  • Äquivalent zu return it;, wenn I ein Zeigertyp ist oder der Ausdruck it.operator->() wohlgeformt ist.
  • Andernfalls äquivalent zu auto&& tmp = *it; return std::addressof(tmp);, wenn std::iter_reference_t<I> ein Referenztyp ist.
  • Andernfalls äquivalent zu return proxy(*it);, wobei proxy eine expositions-nur-Klasse ist (4).
Der Ausdruck in der requires-Klausel ist äquivalent zu
std::indirectly_readable<const I> && (

    requires(const I& i) { i.operator->(); } ||
    std::is_reference_v<std::iter_reference_t<I>> ||
    std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>>

)
.

Inhalt

[edit] Parameter

(keine)

[edit] Rückgabewert

1,2) Referenz auf das aktuelle Element oder prvalue-temporäres Objekt. Äquivalent zu *it.
3) Zeiger oder Iterator auf das aktuelle Element oder Proxy, der es enthält, wie oben beschrieben.

[edit] Beispiel

#include <complex>
#include <initializer_list>
#include <iostream>
#include <iterator>
 
using std::complex_literals::operator""i;
 
int main()
{
    const auto il = {1i, 3.14 + 2i, 3i, 4i, 5i};
 
    using CI = std::common_iterator<
        std::counted_iterator<decltype(il)::iterator>,
        std::default_sentinel_t>;
 
    CI ci{std::counted_iterator{std::next(begin(il), 1), std::ssize(il) - 1}};
 
    std::cout << *ci << ' ' << ci->real() << '\n';
}

Ausgabe

(3.14,2) 3.14

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3574 C++20 variant war vollständig constexpr (P2231R1), aber common_iterator nicht wurde ebenfalls constexpr gemacht
LWG 3595 C++20 funktionsaufrufe des Proxy-Typs fehlten constexpr und noexcept hinzugefügt
LWG 3672 C++20 operator-> könnte in üblichen Fällen per Referenz zurückgeben gibt immer per Wert zurück

[edit] Siehe auch

konstruiert einen neuen common_iterator
(öffentliche Memberfunktion) [edit]