Есть ли способ вызвать ошибку компиляции при попытке присвоить отрицательное число неподписанному контейнеру? - PullRequest
5 голосов
/ 20 сентября 2011

Есть ли способ защиты от полученного двоичного кода из кода в этот вопрос ?В идеале из-за ошибки во время компиляции.Пример кода из вопроса:

unsigned int nVal = 0;
nVal = -5;  // no error!

Ответы [ 2 ]

10 голосов
/ 20 сентября 2011

Если вы используете g ++, переключатель -Wsign-conversion предупредит о преобразовании, а -Werror сделает это предупреждение ошибкой.

4 голосов
/ 20 сентября 2011

Редактировать : Помимо ответа @ thiton.

При простом назначении это невозможно. Однако, если вы присваиваете значение немного особым образом обернутым образом , то это может помочь. т.е.

nVal = -5;

следует заменить на

Assign<-5>(nVal);

Где, Assign() выглядит,

template<int VAL>
void Assign (unsigned int &nVal)
{
  typedef int arr[(VAL >= 0) 1 : -1];
  nVal = VAL;
}

Демо .

...