Моя проблема заключается в следующем: Мартин Йорк утверждает в это , это и это ответы, которые можно сделать 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 Эффекты: Влияет на потоковую буферизацию способом, который определяется отдельно для каждого класса, производного от basic_streambuf в этом разделе.(27.8.1.4, 27.9.1.5).
2 Поведение по умолчанию: Ничего не делает .Возвращает this.
Однако в производных классах поведение, по-видимому, определяется реализацией.Для basic_stringbuf::setbuf
он говорит [stringbuf.virtuals]:
1 Эффекты: определяется реализацией , за исключением того, что setbuf (0,0) не имеетэффект.
Для basic_filebuf::setbuf
написано [filebuf.virtuals]:
12 Эффекты: Если setbuf (0,0) [...], поток становится небуферизованным.В противном случае результаты определяются реализацией .«Небуферизованный» [...]
И все.Поэтому, как я понимаю, действительная реализация может полностью игнорировать эти вызовы (для ненулевых параметров).
Я ошибаюсь?Как правильно интерпретировать стандарт?Есть ли у C ++ 98/03 / 0x такие же гарантии?У вас есть больше статистики о том, какие реализации вышеупомянутый код работает, а какие нет?Как basic_streambuf::setbuf
предназначен для использования?