Я столкнулся с этой проблемой, когда я делал следующий код:
int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
Без int
наложить на vi.size()
вывод мусор, потому что size()
возвращает целое число без знака.
Я бы никогда этого не понял, если бы не нашел ссылку на вектор. Есть ли способ избежать этой ловушки? С -Wall
а также -pedantic
GCC, похоже, не дает никаких предупреждений об этом типе разделения.
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-преобразование.
Других решений пока нет …