标志ios_base :: app的行为错误

时间:2012-10-18 01:45:51

标签: c++ sstream

据我所知,在每次写作之前,标志app寻求结束 const ios_base::openmode std::ios_base::app [static] Seek to end before each write.

以下程序输出为: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;

不应该输出:t2: 123456789recostream而不是?

我正在使用vs2010

Compiled code image

2 个答案:

答案 0 :(得分:4)

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

  

请注意以下程序:

string s("s1: 123456789");
ostringstream s1(s, ios_base::out|ios_base::app);
s1 << "hello";
cout << s1.str() << endl;
  

使用g ++ 4.x打印:

     

s1: 123456789hello

     

使用VisualC ++ 10打印:

     

hello23456789

Mote表示没有为C ++ 03中的字符串流明确指定标志ios_base::ate的行为,而是C ++ 11 added详细的字符串流特定效果。它没有为ios_base::app添加此类详细信息,因此有些编译器没有为实现它而烦恼。

答案 1 :(得分:2)

是的,我认为应该 - 至少在我看来这看起来像编译器(或技术上的)库。

快速检查,g ++(4.7.1)似乎同意 - 它按预期生成t2: 123456789recostream