私の問題は次のとおりです。MartinYorkは、これ、これ、およびこれstringstream
は、次のように使用することで、あるメモリから読み取ることができると答えていますbasic_stringbuf::pubsetbuf
。
char buffer[] = "123";
istringstream in;
in.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); // calls basic_stringbuf::setbuf
int num;
in >> num; // reads 123
残念ながら、私は標準全体を掘り下げて、それがどこで機能することが保証されているのかわかりませんでした。私が見ているのは、それは単なる実装定義です。実際、Microsoftの実装(おそらく他の実装でも)では、この呼び出しは効果がありません。
これが、前回のC++0xドラフトで見つけた関連する引用です。basic_streambuf::setbuf
[streambuf.virt.buffer]の場合:
1効果:この節(27.8.1.4、27.9.1.5)のbasic_streambufから派生したクラスごとに個別に定義される方法で、ストリームのバッファリングに影響を与えます。
2デフォルトの動作: 何もしません。これを返します。
ただし、派生クラスでは、動作は実装定義のままになっているようです。それbasic_stringbuf::setbuf
は[stringbuf.virtuals]と言っています:
1効果: setbuf(0,0)が効果を持たないことを除いて、実装定義。
それbasic_filebuf::setbuf
は[filebuf.virtuals]と言っています:
12効果: setbuf(0,0)[...]の場合、ストリームはバッファリングされなくなります。それ以外の場合、結果は実装定義です。「バッファなし」[...]
以上です。したがって、私が見ているように、有効な実装はこれらの呼び出しを完全に無視できます(null以外のパラメーターの場合)。
私が間違っている?規格の正しい解釈は何ですか?C ++ 98/03 / 0xにも同じ保証がありますか?上記のコードが機能する実装と機能しない実装について、より多くの統計がありますか?どのようbasic_streambuf::setbuf
に使用することを意図していますか?