sha*_*oth 3 c++ stl casting visual-c++
我正在审查一个C++项目并有效地看到以下内容:
std::vector<SomeType> objects;
//then later
int size = (int)objects.size();
for( int i = 0; i < size; ++i ) {
process( objects[i] );
}
Run Code Online (Sandbox Code Playgroud)
这就是我所看到的.std::vector::size()返回size_t的大小可能与某个大小无关int.即使sizeof(int) == sizeof(size_t) int签名也无法容纳所有可能的值size_t.所以上面的代码只能处理一个很长的向量的下半部分并包含一个bug.正确的方法是使用size_t了两个size变量和循环索引.
那说我很好奇作者为什么写这个?
我唯一的猜测是,首先他省略了强制转换(int),编译器发出类似Visual C++ C4018的警告:
warning C4018: '<' : signed/unsigned mismatch
Run Code Online (Sandbox Code Playgroud)
所以作者虽然避免编译器警告的最好方法是简单地将其size_t转换int为使编译器闭嘴.
那个C演员还有其他可能的理智吗?
不,这可能就是原因.此外,矢量可能永远不会太长以至于存在截断大小的风险(app.开发人员会知道这一点).
并且...也许在程序的某些部分,他实际上将"大小"与其他类型的int进行比较,因此将大小设置为"size_t"类型会将其固定在一个地方,但在其他地方将其分解.