Usamos el tipo Integer para representar variables de índice la mayor parte del tiempo. Pero en algunas situaciones, nos vemos obligados a elegir
std::vector<int> vec;
....
for(int i = 0; i < vec.size(); ++i)
....
Esto hará que el compilador genere la advertencia de que el uso mixto de variables con signo / sin signo. si hago que el índice sea variable como for( size_t i = 0; i < vec.size(); i++ )
, (o an unsigned int
) solucionará los problemas.
Cuando es más específico usar tipos de Windows, la mayoría de las API de Windows se ocupan de DWORD (que se definió como sin signo durante mucho tiempo).
Entonces, cuando uso una iteración similar, nuevamente causaré la misma advertencia. Ahora si lo reescribo como
DWORD dwCount;
....
for(DWORD i = 0; i < dwCount; ++i)
....
Esto me parece un poco raro. Puede ser el problema con las percepciones.
Estoy de acuerdo en que se supone que debemos usar el mismo tipo de variable de índice para evitar que los problemas de rango puedan ocurrir con las variables de índice. Por ejemplo, si estamos usando
_int64 i64Count; //
....
for(_int64 i = 0; i < i64Count; ++i)
....
Pero en el caso de DWORD, o enteros sin signo, ¿hay algún problema para reescribirlo como
for(int i = 0; (size_t)i < vec.size(); ++i)
¿Cómo trabaja la mayoría de las personas con problemas similares?
std::size_t
es un rango más alto que int (o incluso largo). Si el tamaño del vector excede alguna vez std::numeric_limits<int>::max()
, lamentará haber usado int.