Ошибка MSVC ++ при делении на 0 никогда не произойдет!исправить? - PullRequest
8 голосов
/ 21 июня 2010
const int bob = 0;

if(bob)
{
    int fred = 6/bob;
}

вы получите ошибку в строке, где делится: «ошибка C2124: разделить или изменить на ноль»

, что плохо, поскольку столь же неизбежно, что проверка «если» не удастся, так как это деление приведет к делению на 0. Честно говоря, я не вижу причин для того, чтобы компилятор хоть что-то вычислял в «если», кроме как для обеспечения целостности скобки.

в любом случае, очевидно, что этот пример не является моей проблемой, моя проблема возникает, когда я выполняю сложные шаблонные вещи, чтобы попытаться сделать как можно больше во время компиляции, в некоторых случаях аргументы могут быть равны 0.

есть ли способ исправить эту ошибку? или отключить это? или любые лучшие обходные пути, чем это:

на данный момент единственное, что я могу придумать (что я делал раньше, когда столкнулся с той же проблемой при рекурсивном доступе к перечислению), - это использовать специализацию шаблонов для выполнения 'if'.

О да, я использую Visual Studio Professional 2005 SP1 с исправлением vista / win7.

Ответы [ 3 ]

4 голосов
/ 21 июня 2010

Полагаю, ваш компилятор пытается оптимизировать фрагмент кода, поскольку bob определено const, так что начальное значение fred может быть определено во время компиляции.Возможно, вы можете предотвратить эту оптимизацию, объявив bob неконстантным или используя ключевое слово volatile.

3 голосов
/ 21 июня 2010

Проблема - и у компилятора нет выбора в этом - заключается в том, что bob является интегральным выражением константы, как и 6. Поэтому 6 / bob также является ICE, и должно быть оценено в время компиляции.

Существует очень простое решение: inline int FredFromBob(int bob) { return 6/bob; } - выражение вызова функции никогда не является ICE, даже если функция тривиальна и объявлена ​​как встроенная.

3 голосов
/ 21 июня 2010

Можете ли вы предоставить более подробную информацию о том, что вы пытаетесь делать с шаблонами? Возможно, вы можете использовать специализированный шаблон для 0, который совсем не похож на старый добрый пример Factorial, и вообще избежать ошибки.

template <int N>
struct Blah 
{
    enum { value = 6 / N };
};

template <>
struct Blah<0> 
{
    enum { value = 0 };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...