std::basic_ios<CharT,Traits>:: tie
|
std::
basic_ostream
<
CharT, Traits
>
*
tie
(
)
const
;
|
(1) | |
|
std::
basic_ostream
<
CharT, Traits
>
*
tie
(
std::
basic_ostream
<
CharT, Traits
>
*
str
)
;
|
(2) | |
Gestiona el flujo vinculado. Un flujo vinculado es un flujo de salida que está sincronizado con la secuencia controlada por el búfer del flujo ( rdbuf() ), es decir, flush ( ) se llama en el flujo vinculado antes de cualquier operación de entrada/salida en * this .
Contenidos |
Parámetros
| str | - | un flujo de salida para establecer como el flujo vinculado |
Valor de retorno
El flujo vinculado, o un puntero nulo si no había ningún flujo vinculado.
Excepciones
Puede lanzar excepciones definidas por la implementación.
Notas
Por defecto, el flujo estándar std::cout está vinculado a std::cin y std::cerr . De manera similar, su contraparte ancha std::wcout está vinculada a std::wcin y std::wcerr .
Ejemplo
#include <fstream> #include <iomanip> #include <iostream> #include <string> int main() { std::ofstream os("test.txt"); std::ifstream is("test.txt"); std::string value("0"); os << "Hello"; is >> value; std::cout << "Result before tie(): " << std::quoted(value) << "\n"; is.clear(); is.tie(&os); is >> value; std::cout << "Result after tie(): " << std::quoted(value) << "\n"; }
Salida:
Result before tie(): "0" Result after tie(): "Hello"
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 835 | C++98 |
dos streams podían estar vinculados entre sí
[1]
(ya sea directamente o a través de otro objeto stream intermedio) |
el comportamiento no está definido en este caso |
-
↑
std::basic_ostream::flush()
es una
UnformattedOutputFunction
, por lo que crea un objeto centinela al ser llamada. Cuando se invoca
flush()en un objeto de flujo, el constructor del objeto centinela llamará aflush()en su flujo vinculado, y eseflush()construirá otro objeto centinela cuyo constructor llamará aflush()en el flujo vinculado de ese flujo, y así sucesivamente. Por lo tanto, si los flujos a y b están vinculados (directa o indirectamente) entre sí, invocar a. flush ( ) eventualmente llamará a b. flush ( ) , que eventualmente llamará a a. flush ( ) , resultando en un bucle infinito.