MSVC ++ erroring на делении 0, которого никогда не будет происходить! зафиксировать?

const int bob = 0;

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

Вы получите ошибку на строке, где деление сделано: "ошибка C2124: разделитесь или модификация на нуль"

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

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

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

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

О, да я использую SP1 Профессионала Visual Studio 2005 года с vista/win7, фиксируют.

9
задан matt 21 June 2010 в 06:37
поделиться

3 ответа

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

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

template <>
struct Blah<0> 
{
    enum { value = 0 };
};
3
ответ дан 4 December 2019 в 21:07
поделиться

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

4
ответ дан 4 December 2019 в 21:07
поделиться

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

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

3
ответ дан 4 December 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: