繁体   English   中英

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

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

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变量的引用。 但是,如果条件不是恒定的,则两个分支都将被编译,并且会得到未定义的引用错误

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM