Неправильное поведение с флагом ios_base :: app

Насколько я знаю флаг app стремится до конца перед каждой записью
const ios_base :: openmode std :: ios_base :: 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;

не должен ли он выводить: t2: 123456789recostream вместо?

Я пользуюсь vs2010

Скомпилированное изображение кода

2

Решение

Это открытый дефект LWG # 2121, открыт Josuttis ранее в этом году. В его отчете в качестве примеров также используются 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

Моте, что поведение флага ios_base::ate не был явно указан для потоков строк в C ++ 03, но в C ++ 11 добавленной подробные строковые эффекты для него. Он не добавил такие детали для ios_base::appпоэтому некоторые компиляторы не удосужились реализовать его.

4

Другие решения

Да, я думаю, что это должно быть — по крайней мере для меня это выглядит как ошибка компилятора (или, технически, библиотеки).

Делая быструю проверку, g ++ (4.7.1), похоже, согласен — он производит t2: 123456789recostream как и ожидалось.

2

По вопросам рекламы [email protected]