#include <fstream>
int main()
{
std::ifstream fin{ "" };
size_t n = fin.tellg(); // ok
}
代码编译好了。但是,根据cppreference,我发现fin.tellg()
是std::fpos
的一种类型,它没有定义将自身隐式转换为size_t
的能力。
有任何解释吗?
答案 0 :(得分:2)
你回答std::fpos
的事实是正确的。现在让我们来看看它是如何定义的:
template<class _Statetype>
class fpos {<...>}
fpos
也有一个转换运算符,用于转换为streamoff
类型,即&#34;流偏移&#34;类型:
__CLR_OR_THIS_CALL operator streamoff() const
{ // return offset
return ((streamoff)(_Myoff + _FPOSOFF(_Fpos)));
}
在我的计算机上streamoff
恰好定义为typedef _Longlong streamoff;
,我相信它在您的计算机上类似。这就是为什么它可以转换为type_t
,但没有什么能阻止它大于type_t
,所以要小心。
答案 1 :(得分:1)
&#34; OK&#34;在你的平台上。并非在所有平台上都可以。在实践中是否意味着很大程度上取决于具体情况。例如,在32位系统上,文件可能是4GB或更大,因此不适合32位size_t
,其中std::fpos
是64位值并保持大小的文件。
如果n
用于确定文件的长度或某些此类文件,如果您错误判断总大小 - 可能会出现严重问题 - 覆盖旧数据,或者加载文件然后根据文件保存那,你丢失了部分或全部数据。