我经常使用 Boost Interprocess library ,它提供了一个I / O流类bufferstream
,它基本上类似于std::stringstream
,但它运行时除外任意用户提供的内存缓冲区。
我已经广泛使用了这个流类,并且我也使用它的源代码来学习很多关于实现/扩展C ++ I / O流的知识。
然而,一条实现代码让我觉得非常奇怪,而且我想知道是否有人确切知道Boost设计师为何如此实现它。
具体来说,它是streambuffer类boost::interprocess::basic_bufferbuf
中的一个函数。此类继承自std::basic_streambuf
,并覆盖所有虚拟保护方法以提供特定行为。
source code可在此处在线浏览。
具体来说,函数basic_bufferbuf::seekpos()
实现如下:
virtual pos_type seekpos(pos_type pos, std::ios_base::openmode mode
= std::ios_base::in | std::ios_base::out)
{ return seekoff(pos - pos_type(off_type(0)), std::ios_base::beg, mode); }
通常,覆盖std::basic_streambuf::seekpos()
的流缓冲区实现只需调用std::basic_streambuf::seekoff
并将起始位置设置为std::ios_base::beg
,这样就可以了。
但是为什么实现者在这里写pos - pos_type(off_type(0))
?为什么从起始位置减去零?有什么用呢?
我怀疑它必须与异常off_type
或pos_type
类型有关,但我无法想象。通常,pos_type
和off_type
只是签名的整数类型。
那么为什么在这里减零呢?