对于以下类型的代码,我总是得到以下警告.
std::vector v;
for ( int i = 0; i < v.size(); i++) {
}
Run Code Online (Sandbox Code Playgroud)
warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
我明白size()返回size_t,只是想知道是否可以安全地忽略此警告,或者我应该创建所有类型的循环变量size_t
我自己确信,在一个项目中,我正在研究有符号整数是大多数情况下的最佳选择,即使其中包含的值永远不会是负数.(更简单的循环反转,更少的错误机会等,特别是对于只能保持0和20之间的值的整数,无论如何.)
出现问题的大多数地方是std :: vector的简单迭代,过去常常是一个数组,之后变为std :: vector.所以这些循环通常如下所示:
for (int i = 0; i < someVector.size(); ++i) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
由于此模式经常使用,因此编译器警告垃圾邮件的数量与签名和未签名类型之间的此比较往往隐藏更多有用的警告.请注意,我们肯定没有带有多个INT_MAX元素的向量,并注意到目前为止我们使用了两种方法来修复编译器警告:
for (unsigned i = 0; i < someVector.size(); ++i) { /*do stuff*/ }
Run Code Online (Sandbox Code Playgroud)
这通常有效但如果循环包含任何代码,如'if(i-1> = 0)......'等,可能会默默地中断.
for (int i = 0; i < static_cast<int>(someVector.size()); ++i) { /*do stuff*/ }
Run Code Online (Sandbox Code Playgroud)
这种变化没有任何副作用,但它确实使循环的可读性降低了很多.(而且它打字更多.)
所以我提出了以下想法:
template <typename T> struct vector : public std::vector<T>
{
typedef std::vector<T> base;
int size() const { return base::size(); }
int max_size() const { return base::max_size(); }
int …Run Code Online (Sandbox Code Playgroud)