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

来自cppreference.com
< cpp‎ | io‎ | basic ios
 
 
 
 
std::basic_ostream<CharT, Traits>* tie() const;
(1)
std::basic_ostream<CharT, Traits>* tie( std::basic_ostream<CharT, Traits>* str );
(2)

管理联系流。联系流是输出流,它与流缓冲(rdbuf())所控制的输出序列同步,即在任何 *this 上的输入/输出操作前,都会在联系流上调用 flush()

1) 返回当前联系流。如果没有联系流,那么返回空指针。
2) 设置当前联系流为 str。返回操作前的联系流。如果没有联系流,那么返回空指针。如果 str 非空且 tie() 通过遍历从 str->tie() 开始的包含联系流对象的链表可及,那么行为未定义。

参数

str - 要设为联系流的输出流

返回值

返回联系流,或在没有联系流时返回空指针。

异常

可能会抛出由实现定义的异常。

注解

默认情况下,联系标准流 std::cinstd::cerrstd::cout。类似地,联系它们的宽对应版本 std::wcinstd::wcerrstd::wcout

示例

#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 << "tie() 之前的结果:" << std::quoted(value) << "\n";
    is.clear();
    is.tie(&os);
 
    is >> value;
 
    std::cout << "tie() 之后的结果:" << std::quoted(value) << "\n";
}

输出:

tie() 之前的结果:"0"
tie() 之后的结果:"Hello"

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 835 C++98 两个流可以互相(直接或通过中间流间接)联系[1] 此时行为未定义
  1. 因为 std::basic_ostream::flush()无格式输出函数 (UnformattedOutputFunction) ,所以它在调用时会创建 sentry 对象。在流对象上调用 flush() 时,sentry 对象的构造函数会调用联系流的 flush(),而该 flush() 又会构造新的 sentry 对象,并且它的构造函数还会调用那个联系流的联系流的 flush(),以此类推。因此如果流 ab 互相(直接或间接)联系,那么调用 a.flush() 最终会调用 b.flush(),而它最终又会调用 a.flush(),最后导致无限循环。