所有不同尺寸类型如何相互关联?

Bjö*_*lex 8 c++ size-type

目前我有一个场景,我想检查将给定字符串写入文件流是否会使文件超出给定大小(这用于日志文件轮换).现在,std::ofstream::tellp()返回一个streampos,但std::string::size()返回一个size_t.结果是,这不起作用:

out_stream.tellp() + string.size() < limit
Run Code Online (Sandbox Code Playgroud)

因为operator +这些类型显然存在模糊的重载.这引出了两个问题:

  1. 如何解决上述歧义?
  2. 如何各种不同类型的(size_t,streamsize,streampos,streamoff)之间的相互关系?什么时候可以安全地转换,以及可能存在的陷阱.我对这些类型感到困惑.我所知道的是,它们是依赖于实现的,并且它们提供了某些保证(例如size_t,总是足够大以容纳大型对象的大小,该大小对象将适合编译应用程序的体系结构的内存),但是它们是什么关于这些类型的互操作性的保证(参见上面的例子,或比较a streamsize到a size_t)?

Mar*_*k B 4

您应该能够通过转换将结果从tellp 转换为a std::string::size_type

static_cast<std::string::size_type>(out_stream.tellp()) + string.size() < limit

编辑:这是安全的,因为您的流偏移量永远不会为负,并且会安全地转换为无符号值。

  • @Space_C0wb0y 因为它是 static_cast (而不是重新解释),如果转换没有意义,编译器会抱怨。应该是安全的。 (2认同)