C ++ 03 seekoff()和seekpos()规范中的奇怪之处

时间:2011-10-17 16:49:40

标签: c++

我正在创建自己的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))的理由?如果没有,你甚至可以想象一个合理的理由吗?

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... }; 无效,因为没有隐式转换。

所以我认为这只是谨慎。