私はstd::streambuf
ロギングシステムの一部としてカスタムを書いてきました。ただし、ストリームからの最初の出力が正しくフォーマットされていないという問題があります。
streambuf
これは、カスタムやostream
クラスを使用しない縮小されたテストケースです。
#include <iostream>
int main()
{
std::streambuf *coutbuf = std::cout.rdbuf();
std::ostream(coutbuf) << "test" << ": writing to cout using a separate ostream." << std::endl;
return 0;
}
g ++を使用してこれをコンパイルします:
$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu8) 4.4.1
$ g++ -o fail reduced-case.cpp
$ ./fail
0x400c80: writing to cout using a separate ostream.
最初の文字列リテラル( "test")は汎用ポインターとしてフォーマットされています(文字列のアドレスは16進数で出力されます)が、2番目の文字列リテラルは正しくフォーマットされていることに注意してください。
私が考えることができる唯一のことは、そのstd::ostream
ように新しく構築されたものを直接使用することは無効であるということです(つまり、それを変数に入れずに)。この場合、何がそれを無効にするのかを正確に知りたいと思います(特に、iostreamとは関係がなく、評価の順序やコンストラクターなどとの相互作用とは関係がないと思います)。それが問題ではない場合、それでは何ですか?