【发布时间】:2010-04-16 12:00:31
【问题描述】:
我正在审查一个 C++ 项目并有效地看到以下内容:
std::vector<SomeType> objects;
//then later
int size = (int)objects.size();
for( int i = 0; i < size; ++i ) {
process( objects[i] );
}
这就是我所看到的。 std::vector::size() 返回size_t,它的大小可能与int 的大小无关。即使sizeof(int) == sizeof(size_t) int 已签名并且不能保存size_t 的所有可能值。所以上面的代码只能处理一个很长的向量的下半部分,并且包含一个错误。正确的方法是将size_t 用于size 变量和循环索引。
也就是说我很好奇作者为什么会写这个?
我唯一的猜测是,首先他省略了 (int) 演员表,编译器发出了类似 Visual C++ C4018 警告:
warning C4018: '<' : signed/unsigned mismatch
所以作者认为避免编译器警告的最佳方法是简单地将 size_t 转换为 int 从而使编译器关闭。
C 演员阵容还有其他可能的合理原因吗?
【问题讨论】:
-
Nitpick:
size()返回实现定义的vector::size_type,不一定是size_t。 -
挑剔的挑剔:默认分配器确实使用
size_t作为size_type。是的,你可以写vector<int>::size_type s = v.size();,但是当你更改v的分配器时,你仍然会使用错误的size_type,并且需要查找和更改用法(但同样,typedefs 可以提供帮助)。跨度> -
只要你 typedef 你的向量类型,使用 YourVectorTypedef::size_type 应该总是返回正确的类型。
-
nitpick 的 nitpick 的 nitpick:只有
std::string使用allocator::size_type作为其size_type。std::vector改用“实现定义的无符号整数类型”。 -
@UncleBens ^^(挑剔通知器)
标签: c++ visual-c++ stl casting