Namespaces
Variants

std::basic_ios<CharT,Traits>:: tie

From cppreference.net
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 .

1) Devuelve el flujo actualmente vinculado. Si no hay ningún flujo vinculado, se devuelve un puntero nulo.
2) Establece el flujo vinculado actual a str . Retorna el flujo vinculado antes de la operación. Si no hay un flujo vinculado, se retorna un puntero nulo. Si str no es nulo y tie ( ) es alcanzable atravesando la lista enlazada de objetos de flujo vinculado comenzando desde str - > tie ( ) , el comportamiento es indefinido.

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
  1. 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á a flush() en su flujo vinculado, y ese flush() construirá otro objeto centinela cuyo constructor llamará a flush() 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.