std::basic_ios<CharT,Traits>::tie
From 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 がヌルではなく、str->tie() から始まる連結されたストリームオブジェクトの連鎖をたどることで 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 | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 835 | C++98 | 2つのストリームが互いに連結される可能性[1] (直接的または別の仲介ストリームオブジェクトを介して) |
この場合、動作は未定義である |
- ↑
std::basic_ostream::flush()は UnformattedOutputFunction であるため、呼び出される際にセントリーオブジェクトを作成します。ストリームオブジェクトに対してflush()が呼び出されると、セントリーオブジェクトの コンストラクタ がその連結されたストリームに対してflush()を呼び出し、そのflush()は別のセントリーオブジェクトを構築し、そのコンストラクタはさらにそのストリームの連結されたストリームに対してflush()を呼び出し、といった具合に処理が続きます。したがって、ストリーム a と b が(直接的または間接的に)互いに連結されている場合、a.flush() を呼び出すと、最終的に b.flush() が呼び出され、さらに a.flush() が呼び出され、無限ループが発生します。