可以[std :: streampos]隐式转换为[size_t]吗?

时间:2017-01-18 08:14:38

标签: c++ type-conversion standards filestream

#include <fstream>

int main()
{
    std::ifstream fin{ "" };
    size_t n = fin.tellg(); // ok
}

代码编译好了。但是,根据cppreference,我发现fin.tellg()std::fpos的一种类型,它没有定义将自身隐式转换为size_t的能力。

有任何解释吗?

2 个答案:

答案 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用于确定文件的长度或某些此类文件,如果您错误判断总大小 - 可能会出现严重问题 - 覆盖旧数据,或者加载文件然后根据文件保存那,你丢失了部分或全部数据。