убить ошибку сравнения без знака / со знаком - PullRequest
4 голосов
/ 29 апреля 2010

В общем, я хочу получать предупреждения о неподписанных и подписанных.

Однако, в данном конкретном случае, я хочу, чтобы оно было подавлено;

std::vector<Blah> blahs;

for(int i = 0; i < blahs.size(); ++i) { ...

Я хочу убить это сравнение.

Спасибо!

(с использованием g ++)

1 Ответ

12 голосов
/ 29 апреля 2010

Вы должны исправить, а не подавить. Используйте тип без знака:

for (size_t i = 0; i < blahs.size(); ++i)

Вы также можете использовать unsigned, но size_t здесь более уместно (и может иметь другой, больший диапазон). Если вы используете i только для итерации и вам не нужно его значение в цикле, используйте вместо этого итераторы:

for (auto iter = blahs.begin(), end = blahs.end(); iter != end; ++iter)

Если ваш компилятор не поддерживает auto, замените auto на T::iterator или T::const_iterator, где T - это тип blahs. Если ваш компилятор поддерживает более полное подмножество C ++ 11, сделайте следующее:

for (auto& element : blahs)

Что лучше всего.


Строго говоря, вышесказанное не является "правильным". Должно быть:

typedef std::vector<Blah> blah_vec;
blah_vec blahs;

for (blah_vec::size_type i = 0; i < blahs.size(); ++i)

Но это может быть многословно, и каждая известная мне реализация в любом случае использует size_t как size_type.


Если по какой-то причине вам действительно нужен целочисленный тип со знаком для i, вам придется разыграть:

// assumes size() will fit in an int
for (int i = 0; i < static_cast<int>(blahs.size()); ++i)

// assumes i will not be negative (so use an unsigned type!)
for (int i = 0; static_cast<size_t>(i) < blahs.size(); ++i)

// and the technically correct way, assuming i will not be negative
for (int i = 0; static_cast<blah_vec::size_type>(i) < blahs.size(); ++i)
...