为什么三元运算符在编译时的工作方式与运行时不同?

Why does the ternary operator work differently at compile time compared to the run time?

本文关键字:方式 工作 运行时 编译 三元 运算符 为什么      更新时间:2023-10-16
template <uint_fast64_t MAX_RAND>
struct RandomLimit
{
static const uint_fast64_t steps =
RAND_MAX >= MAX_RAND ? 
1 : 
RandomLimit<MAX_RAND / (RAND_MAX + 1)>::steps + 1;
};

上面的代码产生和错误;步骤未定义。在运行时,如果函数调用代替最后一个表达式,则不会调用此函数,也不会发生副作用。当条件成立时,为什么不消除此代码?

请注意,RAND_MAX是 cstdlib 常量,我使用的是 Visual Studio 2015 安装程序。

可能是链接器错误,而不是编译器错误。

也就是说,steps成员在头文件中正确声明,因此代码可以很好地编译,但是,如果条件始终为 true,则编译器会优化else表达式,并且不会发出对steps变量的引用。但是,如果条件不是常量,则会编译两个分支,并且会出现未定义的引用错误

显然,解决方案是将正确的库添加到链接器命令中。

相关文章: