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) | |
Управляет связанным потоком. Связанный поток - это выходной поток, который синхронизирован с последовательностью, управляемой буфером потока ( rdbuf() ), то есть flush ( ) вызывается для связанного потока перед любой операцией ввода/вывода с * this .
Содержание |
Параметры
| 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]
(напрямую или через другой промежуточный объект потока) |
в этом случае поведение не определено |
-
↑
std::basic_ostream::flush()
является
UnformattedOutputFunction
, поэтому при вызове создает объект-страж. Когда
flush()вызывается для объекта потока, конструктор объекта-стража вызываетflush()на связанном потоке, и этотflush()создаст другой объект-страж, чей конструктор вызоветflush()на связанном потоке этого потока и так далее. Следовательно, если потоки a и b связаны (напрямую или косвенно) друг с другом, вызов a. flush ( ) в конечном счете вызовет b. flush ( ) , который в конечном счете вызовет a. flush ( ) , что приведет к бесконечному циклу.