我的问题如下: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]:
1效果:影响流缓冲的方式为本条款(27.8.1.4、27.9.1.5)中从 basic_streambuf 派生的每个类单独定义。
2默认行为: 什么都不做。返回这个。
然而,在派生类中,它似乎保留了行为实现定义。因为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
打算如何使用?