const int bob = 0;
if(bob)
{
int fred = 6/bob;
}
Вы получите ошибку на строке, где деление сделано: "ошибка C2124: разделитесь или модификация на нуль"
который является Ламе, потому что столь же неизбежно, что, 'если' проверка перестанет работать, как это - деление, приведет к отделению 0. вполне откровенно я не вижу оснований для компилятора для ровной оценки чего-либо в 'если', кроме гарантировать целостность фигурной скобки.
так или иначе очевидно, тем примером не является моя проблема, моя проблема возникает, когда выполнение усложнило шаблонный материал, чтобы попытаться сделать как можно больше во время компиляции, в некоторых случаях аргументы могут быть 0.
там должен так или иначе зафиксировать эту ошибку? или отключите его? или любые лучшие обходные решения, чем это:
в настоящее время единственная работа вокруг я могу думать (который я сделал, прежде, когда я встретился с той же проблемой с рекурсивным перечислимым доступом) должен использовать шаблонную специализацию, чтобы сделать 'если'.
О, да я использую SP1 Профессионала Visual Studio 2005 года с vista/win7, фиксируют.
Можете ли вы предоставить более подробную информацию о том, что вы пытаетесь сделать с помощью шаблонов? Возможно, вы можете использовать специализированный шаблон для 0, который не делает ничего похожего на старый добрый пример Factorial, и вообще избежать ошибки.
template <int N>
struct Blah
{
enum { value = 6 / N };
};
template <>
struct Blah<0>
{
enum { value = 0 };
};
Я полагаю, ваш компилятор пытается оптимизировать фрагмент кода, поскольку bob
определен const
, так что начальное значение fred
может быть определено во время компиляции . Возможно, вы сможете предотвратить эту оптимизацию, объявив bob неконстантным или используя ключевое слово volatile
.
Проблема - и у компилятора нет выбора - в том, что bob
является выражением интегральной константы, как и 6. Следовательно, 6 / bob также является ICE, и должен оцениваться во время компиляции.
Есть очень простое решение: inline int FredFromBob (int bob) {return 6 / bob; }
- выражение вызова функции никогда не является ICE, даже если функция тривиальна и объявлена встроенной.