std:: istreambuf_iterator
|
Definiert im Header
<iterator>
|
||
|
template
<
class
CharT,
class
Traits
=
std::
char_traits
<
CharT
>
>
class
istreambuf_iterator
|
(bis C++17) | |
|
template
<
class
CharT,
class
Traits
=
std::
char_traits
<
CharT
>
>
class istreambuf_iterator ; |
(seit C++17) | |
std::istreambuf_iterator
ist ein Einweg-Eingabeiterator, der aufeinanderfolgende Zeichen aus dem
std::basic_streambuf
-Objekt liest, für das er konstruiert wurde.
Der standardmäßig konstruierte
std::istreambuf_iterator
wird als
End-of-Stream-Iterator
bezeichnet. Wenn ein
std::istreambuf_iterator
das Ende des zugrunde liegenden Streams erreicht, wird er gleich dem End-of-Stream-Iterator. Ein weiteres Dereferenzieren oder Inkrementieren ruft undefiniertes Verhalten hervor.
|
|
(seit C++11) |
Inhaltsverzeichnis |
Mitgliedertypen
| Mitgliedertyp | Definition |
iterator_category
|
std:: input_iterator_tag |
value_type
|
CharT |
difference_type
|
typename Traits :: off_type |
pointer
|
/* unspecified */ |
reference
|
CharT |
char_type
|
CharT
|
traits_type
|
Traits
|
int_type
|
typename Traits :: int_type |
streambuf_type
|
std:: basic_streambuf < CharT, Traits > |
istream_type
|
std:: basic_istream < CharT, Traits > |
/* proxy */
|
Implementierungsdefinierter Klassentyp.
Ein
proxy
-Objekt enthält ein
char_type
-Zeichen und einen
streambuf_type*
-Zeiger.
Das Dereferenzieren eines
proxy
-Objekts mit
operator*
liefert das gespeicherte Zeichen.
( Nur zur Veranschaulichung dienender Mitgliedertyp* ) |
|
Die Member-Typen
|
(bis C++17) |
Der Member-Typ
pointer
ist normalerweise
CharT*
(siehe
unten
).
Memberfunktionen
konstruiert einen neuen
istreambuf_iterator
(public member function) |
|
|
(destructor)
(implicitly declared)
|
zerstört einen
istreambuf_iterator
(public member function) |
|
erhält eine Kopie des aktuellen Zeichens
(public member function) |
|
|
bewegt den Iterator vorwärts
(public member function) |
|
prüft, ob beide
istreambuf_iterator
s End-of-Stream sind oder beide gültig sind
(public member function) |
Nicht-Member-Funktionen
|
(entfernt in C++20)
|
vergleicht zwei
istreambuf_iterator
s
(Funktions-Template) |
Hinweise
Die Lösung von
LWG Issue 659
führte
operator
-
>
ein. Es wird erwartet, dass für einen
std::istreambuf_iterator
i
die Ausdrücke
(
*
i
)
.
m
und
i
-
>
m
denselben Effekt haben.
Allerdings bietet die Resolution keine formale Spezifikation ihres Verhaltens. Daher wird sie unterschiedlich implementiert, einschließlich der Rückgabe von nullptr , der Rückgabe der Adresse eines temporären Objekts oder dem vollständigen Fehlen des Members. Das beabsichtigte Verhalten ist kaum zu erreichen, und es wurde durch die Resolution von LWG issue 2790 entfernt.
Die Lösung von
LWG Issue 659
machte auch den Member-Typ
pointer
nicht spezifiziert, um zu ermöglichen, dass
operator->
einen Proxy zurückgibt. Dies ermöglicht es
operator->
zu kompilieren, wenn
CharT
kein Klassentyp ist.
Beispiel
#include <iostream> #include <iterator> #include <sstream> #include <string> int main() { // Typischer Anwendungsfall: Ein Eingabestrom dargestellt als Iteratorpaar std::istringstream in{"Hello, world"}; std::istreambuf_iterator<char> it{in}, end; std::string ss{it, end}; std::cout << "ss hat " << ss.size() << " Bytes; " "it enthält \"" << ss << "\"\n"; // Demonstration des Single-Pass-Verhaltens std::istringstream s{"abc"}; std::istreambuf_iterator<char> i1{s}, i2{s}; std::cout << "i1 gibt '" << *i1 << "' zurück\n" "i2 gibt '" << *i2 << "' zurück\n"; ++i1; std::cout << "nach Inkrementieren von i1, aber nicht i2:\n" "i1 gibt '" << *i1 << "' zurück\n" "i2 gibt '" << *i2 << "' zurück\n"; ++i2; std::cout << "nach Inkrementieren von i2, aber nicht i1:\n" "i1 gibt '" << *i1 << "' zurück\n" "i2 gibt '" << *i2 << "' zurück\n"; }
Ausgabe:
ss hat 12 Bytes; it enthält "Hello, world" i1 gibt 'a' zurück i2 gibt 'a' zurück nach Inkrementieren von i1, aber nicht i2: i1 gibt 'b' zurück i2 gibt 'b' zurück nach Inkrementieren von i2, aber nicht i1: i1 gibt 'c' zurück i2 gibt 'c' zurück
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 659 | C++98 |
1.
std::istreambuf_iterator
hatte kein
operator
-
>
2. der Member-Typ
pointer
war als
CharT*
spezifiziert
|
1. hinzugefügt
2. als unspezifiziert festgelegt |
| LWG 2790 | C++98 | der durch LWG Issue 659 hinzugefügte operator - > war nicht nützlich | entfernt |
Siehe auch
|
Ausgabe-Iterator, der in
std::basic_streambuf
schreibt
(Klassentemplate) |
|
|
Eingabe-Iterator, der aus
std::basic_istream
liest
(Klassentemplate) |