std::basic_ios<CharT,Traits>::tie
来自cppreference.com
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::cin 和 std::cerr 到 std::cout。类似地,联系它们的宽对应版本 std::wcin 和 std::wcerr 到 std::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] | 此时行为未定义 |
- ↑ 因为 std::basic_ostream::flush() 是无格式输出函数 (UnformattedOutputFunction) ,所以它在调用时会创建 sentry 对象。在流对象上调用
flush()
时,sentry 对象的构造函数会调用联系流的flush()
,而该flush()
又会构造新的 sentry 对象,并且它的构造函数还会调用那个联系流的联系流的flush()
,以此类推。因此如果流 a 和 b 互相(直接或间接)联系,那么调用 a.flush() 最终会调用 b.flush(),而它最终又会调用 a.flush(),最后导致无限循环。