我正在创建自己的streambuf
子类并使用C ++ 03规范(ISO / IEC 14882:2003)作为参考。
在第27.5.2.4.2节[lib.streambuf.virt.buffer]中,basic_streambuf::seekoff()
和basic_streambuf::seekpos()
的规范都说:
默认行为:返回pos_type(off_type(-1))。
现在,我认为off_type
应该是带符号的整数类型,pos_type
应该是无符号整数类型,所以在我看来这个表达式必须等同于{{ 1}}。
但是假设我错了,这些类型可能是签名和无符号的其他组合...然后我仍然无法弄清楚这种双重演员的任何可能用途。
例如,如果两者都已签名,则表达式再次等同于pos_type(-1)
。
如果pos_type(-1)
已签名且pos_type
未签名 - 这没有任何意义,但请耐心等待 - 那么这个双重演员最多会将一些巨大的价值推到off_type
并且在最坏的情况下,它会通过为签名的pos_type
整数分配一个太大的值来调用实现定义的行为。
是否有人知道标准在此处指定pos_type
而不仅仅是pos_type(off_type(-1))
的理由?如果没有,你甚至可以想象一个合理的理由吗?
答案 0 :(得分:4)
我认为pos_type
默认情况下归结为std::streampos
,通常定义如下:
typedef fpos<mbstate_t> streampos;
std::fpos
通常是与多字节状态对象结合的偏移量。
此外,off_type
默认情况下会归结为std::streamoff
,这也是有符号整数类型(long
或类似的东西)
所以我认为这里的心态是你可以初始化一个带有sentinal -1
值的偏移类型,然后可以用来初始化一个位置对象,这是一个更复杂的对象。因为,fpos
的构造函数采用streamoff
类型,而不是long
,如果 streamoff
可能是{{1}更复杂的类型或类似的,它会使必要的谨慎。
想象一下long
定义如下的实现:
streamoff
然后只有struct streamoff {
explicit streamoff(long offset);
// rest of the stuff here...
};
无效,因为没有隐式转换。
所以我认为这只是谨慎。