【发布时间】:2011-07-12 19:59:06
【问题描述】:
目前我有一个场景,我想检查将给定字符串写入文件流是否会使文件增长超过给定大小(这用于日志文件轮换)。现在,std::ofstream::tellp() 返回 streampos,但 std::string::size() 返回 size_t。效果是,这不起作用:
out_stream.tellp() + string.size() < limit
因为这些类型显然存在 operator + 的模棱两可的重载。这引出了两个问题:
- 如何解决上述歧义?
- 所有不同的类型(
size_t、streamsize、streampos、streamoff)如何相互关联?什么时候可以安全地转换它们,以及可能的陷阱是什么。我通常对这些类型感到困惑。我所知道的是它们依赖于实现,并且它们做出了某些保证(例如,size_t总是足够大,可以容纳适合编译应用程序的体系结构内存中的 larges 对象的大小),但是这些类型的互操作性有哪些保证(参见上面的示例,或将streamsize与size_t进行比较)?
【问题讨论】:
-
std::string::size()返回一个std::string::size_type,不能保证是size_t。 -
@Etienne:感谢您澄清这一点。不幸的是,这只会让事情变得更复杂。
-
@Etienne:对大多数人来说是这样(即,当没有使用自定义分配器时):stackoverflow.com/questions/918567/size-t-vs-containersize-type