`basic_streambuf :: setbuf`的效果

ybu*_*ill 16 c++ language-lawyer c++11

我的问题如下:Martin York声称,这个,并且这个答案可以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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我挖掘了整个标准,无法确定它在哪里工作.我看到的只是实现定义.实际上在微软的实现上(也许在其他人的实现上),这个调用没有任何效果.

以下是我在上一篇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)[...],则流变为无缓冲.否则结果是实现定义的."无缓冲"[...]

就是这样.所以我看到它,一个有效的实现可以完全忽略这些调用(对于非null参数).

我错了吗?这个标准的正确解释是什么?C++ 98/03/0x有相同的保证吗?您是否有更多关于上述代码的哪些实现以及不适用的实现的统计信息?如何basic_streambuf::setbuf使用?

ice*_*ime 8

我相信它是实现定义的,并且您提供了相关的引用.

为了记录,这就是标准C++ IOStreams和locales,这不是我不得不承认的最近的一本书,不得不在标题为" 几乎语义自由函数 -setbuf() " 的部分中说明这个问题:

虚拟成员函数setbuf() 是一个相当特殊的流缓冲成员.它的语义基本上是未定义的.对于字符串流缓冲区,语义setbuf()是实现定义的,除了定义之外 setbuf(0, 0):如果 setbuf(0, 0)之前在流上调用并且I/O在该流上发生,则流变为无缓冲,这意味着字符直接传入和传出文件系统.否则,结果是实现定义的.

但是,setbuf()for 的规范 basic_filebuf并且 basic_stringbuf几乎不对setbuf()其他流缓冲器类型的语义施加任何要求 .最好的情况是,通用语义可以定义为设备,在用户定义的流缓冲区类型的情况下,可以定义为特定于实现.

缺乏任何要求可以让您重新定义setbuf()几乎任何目的,并以任何方式适合预定义的接口 setbuf().


归档时间:

查看次数:

1366 次

最近记录:

15 年 前