const int bob = 0;
if(bob)
{
int fred = 6/bob;
}
您将在完成除法的行上收到错误: “错误C2124:除以或模零”
这是蹩脚的,因为'if'检查失败是不可避免的,因为除法将导致div为0.坦率地说,我认为编译器甚至无法评估任何内容'if',除了确保支撑完整性。
无论如何,显然这个例子不是我的问题,我的问题来自于做复杂的模板尝试在编译时尽可能多地做,在某些情况下参数可能是0。
无论如何都要修复此错误?或禁用它?或者比这更好的解决方法:
目前我能想到的唯一一项工作(我之前遇到过与递归枚举访问相同的问题)是使用模板特化来执行'if'。
哦,是的,我正在使用Visual Studio Professional 2005 SP1和vista / win7修复程序。
答案 0 :(得分:4)
我想您的编译器会尝试优化代码片段,因为bob
已定义为const
,因此可以在编译时确定fred
的初始值。也许你可以通过声明bob non-const或使用volatile
关键字来阻止这种优化。
答案 1 :(得分:3)
您能否提供有关您尝试使用模板的更多详细信息?也许你可以使用0的专用模板,它在旧的Factorial示例中没有任何作用,并且完全避免错误。
template <int N>
struct Blah
{
enum { value = 6 / N };
};
template <>
struct Blah<0>
{
enum { value = 0 };
};
答案 2 :(得分:3)
问题 - 编译器在此没有选择 - 是bob
是一个积分常量表达式,因为6。因此6 / bob也是一个ICE,必须在编译时进行评估。
有一个非常简单的解决方案:inline int FredFromBob(int bob) { return 6/bob; }
- 函数调用表达式永远不是ICE,即使函数是微不足道的并且是内联声明的。