我的问题如下:Martin York在this,this和this中声明,可以通过使用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]:但是,在派生类中,似乎保留了行为定义的实现。对于
basic_stringbuf::setbuf
,它说[stringbuf.virtuals]:对于
basic_filebuf::setbuf
,它说[filebuf.virtuals]:就是这样。因此,正如我所看到的,有效的实现可以完全忽略这些调用(对于非null参数)。
我错了吗?该标准的正确解释是什么? C++ 98/03/0x是否具有相同的保证?您是否对上述代码在哪些实现上有效以及在哪些无效上没有更多统计信息?打算如何使用
basic_streambuf::setbuf
? 最佳答案
我相信它是实现定义的,您提供了相关的报价。
记录下来,这是Standard C++ IOStreams and locales,而不是我必须承认的一本新书,在标题为“几乎没有语义的功能-setbuf()
”的部分中要说的是: