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)

Управляет связанным потоком. Связанный поток - это выходной поток, который синхронизирован с последовательностью, управляемой буфером потока ( rdbuf() ), то есть flush ( ) вызывается для связанного потока перед любой операцией ввода/вывода с * this .

1) Возвращает текущий связанный поток. Если связанного потока нет, возвращается нулевой указатель.
2) Устанавливает текущий связанный поток в str . Возвращает связанный поток до операции. Если связанного потока нет, возвращается нулевой указатель. Если str не является нулевым и tie ( ) достижим при обходе связного списка объектов связанных потоков, начиная с str - > tie ( ) , поведение не определено.

Содержание

Параметры

str - выходной поток, устанавливаемый как связанный поток

Возвращаемое значение

Связанный поток, или нулевой указатель, если связанного потока не было.

Исключения

Может генерировать исключения, определяемые реализацией.

Примечания

По умолчанию стандартный поток std::cout связан с std::cin и std::cerr . Аналогично, его широкий аналог std::wcout связан с std::wcin и std::wcerr .

Пример

#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";
}

Вывод:

Result before tie(): "0"
Result after tie(): "Hello"

Отчёты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 835 C++98 два потока могли быть связаны друг с другом [1]
(напрямую или через другой промежуточный объект потока)
в этом случае поведение не определено
  1. std::basic_ostream::flush() является UnformattedOutputFunction , поэтому при вызове создает объект-страж. Когда flush() вызывается для объекта потока, конструктор объекта-стража вызывает flush() на связанном потоке, и этот flush() создаст другой объект-страж, чей конструктор вызовет flush() на связанном потоке этого потока и так далее. Следовательно, если потоки a и b связаны (напрямую или косвенно) друг с другом, вызов a. flush ( ) в конечном счете вызовет b. flush ( ) , который в конечном счете вызовет a. flush ( ) , что приведет к бесконечному циклу.