Я рассматриваю проект 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-броска?