C++ 标志ios_base::app的错误行为

C++ 标志ios_base::app的错误行为,c++,sstream,C++,Sstream,据我所知,flagapp在每次写入之前都会搜索到末尾 以下程序输出为:recostream789 std::string str("t2: 123456789"); std::ostringstream ostr(str,std::ios_base::out|std::ios_base::app); ostr << "recostream"; std::cout << ostr.str() << std::endl; std::string str(“t2

据我所知,flag
app
在每次写入之前都会搜索到末尾

以下程序输出为:
recostream789

std::string str("t2: 123456789");
std::ostringstream ostr(str,std::ios_base::out|std::ios_base::app);
ostr << "recostream";
std::cout << ostr.str() << std::endl;
std::string str(“t2:123456789”);
std::ostringstream ost(str,std::ios_base::out | std::ios_base::app);
ostr是的,我认为应该——至少对我来说,这看起来像是一个编译器(或者,从技术上说,是库)bug

通过快速检查,g++(4.7.1)似乎同意了这一点——它按照预期生成了
t2:123456789recostream

这是开放缺陷,由Josuttis在今年早些时候开放。他的报告也以GCC和Visual Studio为例,引用如下:

请注意以下程序:

字符串s(“s1:123456789”);
ostringstream s1(s,ios_base::out | ios_base::app);

s1这对我来说就像预期的一样,但是使用GCC 4.7.oh没有看到,我是
使用名称空间std
但是,没有它和
std::
限定符,它仍然是相同的输出,也编辑了问题Yep我看到了更新。我也修改了我的评论。对于这种奇怪的行为似乎并没有真正的解释。相同(不正确)VS2012上的行为。请注意声明microsoft是正确的。@JesseGood:我会给STL发送一封电子邮件——我看不到有任何内容表明,§27.5.3.1.4/1:
应用程序在每次写入之前寻求结束应被忽略。
。@JerryCoffin:如果mode&ios_base::ate是真的,pptr()==pbase()+s.size(),否则pptr()==pbase()是真的
否则pptr()==pbase()
部分似乎说当前位置应该指向开头,除非使用了
ios_base::ate
。@JesseGood:我已经写了另一条评论作为回复,但看看Cubbi的答案,它似乎已经作为一个bug报告给委员会了。我仍然认为gcc是对的,而VC++是错的。指定了
ios_base::app
后,put指针应位于构造时的开头,但应位于写入之前的结尾。我在这里看不到真正的冲突或缺乏明确性。是的,直觉上,gcc是正确的,尽管标准中当前的措辞不够充分(而且P.J.Plauger似乎反对它,尽管我不理解其理由)。+1对于参考文献,缺陷比我读到的更深
string s("s1: 123456789");
ostringstream s1(s, ios_base::out|ios_base::app);
s1 << "hello";
cout << s1.str() << endl;