std:: istreambuf_iterator
|
Definido en el encabezado
<iterator>
|
||
|
template
<
class
CharT,
class
Traits
=
std::
char_traits
<
CharT
>
>
class
istreambuf_iterator
|
(hasta C++17) | |
|
template
<
class
CharT,
class
Traits
=
std::
char_traits
<
CharT
>
>
class istreambuf_iterator ; |
(desde C++17) | |
std::istreambuf_iterator
es un iterador de entrada de una sola pasada que lee caracteres sucesivos del
std::basic_streambuf
para el cual fue construido.
El constructor por defecto de
std::istreambuf_iterator
se conoce como el iterador de
fin-de-flujo
. Cuando un
std::istreambuf_iterator
alcanza el final del flujo subyacente, se vuelve igual al iterador de fin-de-flujo. Desreferenciarlo o incrementarlo más allá invoca comportamiento indefinido.
|
|
(desde C++11) |
Contenidos |
Tipos de miembros
| Tipo de miembro | Definición |
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 */
|
Tipo de clase definido por la implementación.
Un objeto
proxy
contiene un carácter
char_type
y un puntero
streambuf_type*
.
Desreferenciar un objeto
proxy
con
operator*
produce el carácter almacenado.
( tipo de miembro solo para exposición* ) |
|
Los tipos de miembro
|
(hasta C++17) |
El tipo miembro
pointer
normalmente es
CharT*
(ver
abajo
).
Funciones miembro
construye un nuevo
istreambuf_iterator
(función miembro pública) |
|
|
(destructor)
(implicitly declared)
|
destruye un
istreambuf_iterator
(función miembro pública) |
|
obtiene una copia del carácter actual
(función miembro pública) |
|
|
avanza el iterador
(función miembro pública) |
|
comprueba si ambos
istreambuf_iterator
s son de fin-de-flujo o si ambos son válidos
(función miembro pública) |
Funciones no miembro
|
(eliminado en C++20)
|
compara dos
istreambuf_iterator
s
(plantilla de función) |
Notas
La resolución de
LWG issue 659
introdujo
operator
-
>
. Se espera que dado un
std::istreambuf_iterator
i
, las expresiones
(
*
i
)
.
m
y
i
-
>
m
tengan el mismo efecto.
Sin embargo, la resolución no proporciona una especificación formal de su comportamiento. Por lo tanto, se implementa de manera diferente, incluyendo devolver nullptr , devolver la dirección de un temporal, o incluso no proporcionar el miembro en absoluto. Su comportamiento previsto difícilmente puede lograrse, y se elimina mediante la resolución de LWG issue 2790 .
La resolución de
LWG issue 659
también hizo que el tipo miembro
pointer
no esté especificado para permitir que
operator->
devuelva un proxy. Esto permite que
operator->
compile cuando
CharT
no es un tipo clase.
Ejemplo
#include <iostream> #include <iterator> #include <sstream> #include <string> int main() { // caso de uso típico: un flujo de entrada representado como un par de iteradores std::istringstream in{"Hello, world"}; std::istreambuf_iterator<char> it{in}, end; std::string ss{it, end}; std::cout << "ss tiene " << ss.size() << " bytes; " "contiene \"" << ss << "\"\n"; // demostración de la naturaleza de paso único std::istringstream s{"abc"}; std::istreambuf_iterator<char> i1{s}, i2{s}; std::cout << "i1 devuelve '" << *i1 << "'\n" "i2 devuelve '" << *i2 << "'\n"; ++i1; std::cout << "después de incrementar i1, pero no i2:\n" "i1 devuelve '" << *i1 << "'\n" "i2 devuelve '" << *i2 << "'\n"; ++i2; std::cout << "después de incrementar i2, pero no i1:\n" "i1 devuelve '" << *i1 << "'\n" "i2 devuelve '" << *i2 << "'\n"; }
Salida:
ss tiene 12 bytes; contiene "Hello, world" i1 devuelve 'a' i2 devuelve 'a' después de incrementar i1, pero no i2: i1 devuelve 'b' i2 devuelve 'b' después de incrementar i2, pero no i1: i1 devuelve 'c' i2 devuelve 'c'
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 659 | C++98 |
1.
std::istreambuf_iterator
no tenía
operator
-
>
2. el tipo miembro
pointer
se especificaba como
CharT*
|
1. añadido
2. hecho no especificado |
| LWG 2790 | C++98 | el operator - > añadido por LWG issue 659 no era útil | eliminado |
Véase también
|
iterador de salida que escribe en
std::basic_streambuf
(plantilla de clase) |
|
|
iterador de entrada que lee desde
std::basic_istream
(plantilla de clase) |