Избегайте подписанного целого числа без знака

Я столкнулся с этой проблемой, когда я делал следующий код:

int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();

Без int наложить на vi.size() вывод мусор, потому что size() возвращает целое число без знака.

Я бы никогда этого не понял, если бы не нашел ссылку на вектор. Есть ли способ избежать этой ловушки? С -Wall а также -pedanticGCC, похоже, не дает никаких предупреждений об этом типе разделения.

2

Решение

gcc имеет -Wconversion флаг, который для этого случая предупреждает меня:

warning: conversion to ‘int’ from ‘std::vector<int>::size_type {aka long unsigned int}’   may alter its value [-Wconversion]
int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
^

GCC документы говорит:

-Wconversion

Предупреждать о неявных преобразованиях, которые могут изменить значение. Это включает в себя преобразования между действительным и целым числом, например, abs (x), когда x является двойным; преобразования между знаком и без знака, как без знака ui = -1; и преобразования в меньшие типы, такие как sqrtf (M_PI). Не предупреждайте о явных приведениях, таких как abs ((int) x) и ui = (unsigned) -1, или если значение не изменяется при преобразовании, как в abs (2.0). Предупреждения о преобразованиях между знаковыми и беззнаковыми целыми числами можно отключить, используя -Wno-sign-преобразование.

В случае C ++ также предупредите о путанице в разрешении перегрузки для пользовательских преобразований; и преобразования, которые никогда не используют оператор преобразования типов: преобразования в void, тот же тип, базовый класс или ссылку на них. Предупреждения о преобразованиях между знаковыми и беззнаковыми целыми числами по умолчанию отключены в C ++, если явно не включена опция -Wsign-преобразование.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]