続 std::basic_ostringstream

id:fifth_moon:20061106:1162823847 に id:nevil さんからコメントいただいたので追試してみました。
まず簡単なソースをでっちあげて gdb にかけてみます。

typedef unsigned short unishort;
typedef std::basic_string unistring;
typedef std::basic_ostringstream ounistringstream;

ounistringstream ounistrm;
ounistrm << unishort(0x4230);
std::cout << ounistrm.str().size() << std::endl;

すると、std::basic_ostream >::operator<< 中で std::ios_base::failbit が立ちます。ounistrm << (unistring() += unishort(0x4243)) は期待通りに動くので ounistrm << unishort(0x4243) の問題らしい。そこで

ounistringstream& operator<<(ounistringstream& ostrm, const unishort us) {
  return ostrm;
}

とすると std::ios_base::failbit が立ちません。そうゆうことか。

ounistringstream& operator<<(ounistringstream& ostrm, const unishort us) {
  ostrm.str(ostrm.str() += us);
  return ostrm;
}

これで期待通りに動くようになりました。