为什么标准同时具有seekpos()和seekoff()?

Nem*_*emo 13 c++ language-lawyer

标题基本概括了所有内容.

我实现我自己的streambuf类,我想知道什么时,他们决定包括委员会的想法std::streambuf::seekpos()std::streambuf::seekoff()(同样地,对于相关的pubseekpos()pubseekoff()).

在我看来,它seekpos(x)应该具有与seekoff(x, std::ios::beg)我能想象的每种情况相同的效果.但也许我的想象力不够好.所以,为什么你想要将两者seekpos完全归入seekoff?或者至少,为什么不让前者的默认实现只调用后者?

如果答案是"因为这是STL所做的"或类似的,那么假设我询问STL或类似的理由.

(我意识到第一个参数seekpos是a streampos的第一个参数seekoff是a streamoff.但请注意,27.4.3.2 [lib.fpos.operations]要求流位置可以转换为流偏移并返回,所以我不认为这是答案.)

Chr*_*phe 13

这两个函数使用不同的参数:

你是完全正确的:他们可以双向转换.但是有一个微妙的语义差异:

  • streampos直观地与固定位置相关,而streamoff在某种程度上与文件中的运动有关.
  • 从其减去一个streampos从另一个streampos使一个streamoff.
  • 添加一个streamposstreamoff一个新的streampos.
  • 其他组合是有效的,这要归功于简单的转换,但需要更多的关注.
  • 宽流wstreampos用于该位置(因为显然a中的位置wchar_t具有与char流中的位置不同的含义).
  • 但是宽流streamoff用于运动,因为它是与位置相比的相对运动.

如果您使用模板编程,这些语义差异对于特征更明确:S::pos_typeS::off_type.

真正的起源

无论这些语义潜意识如何,这种差异的真正起源是历史的,并且与C标准库有关,正如Plauger先生在本文中所解释的那样:

  • streamoff在设计时fseek()ftell()记C标准库,其使用的long用于定位.
  • streampos是为了fgetpos()并且fsetpos()使用了一个fpos_t论点.

我可以验证这已经是C89标准的情况.由于原始K&R中没有提及这些功能,因此UNIX历史学家可能会更多地了解更远的路径.

本文解释了标准委员会最近的想法.似乎历史性的差异受到了质疑,现在还不再清楚是否真的需要它.