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

时间:2017-03-31 18:28:54

标签: c++ c++11 templates metaprogramming ternary-operator

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安装程序。

1 个答案:

答案 0 :(得分:1)

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

也就是说,steps成员在头文件中正确声明,因此代码编译得很好,但是如果条件总是为真,那么编译器会优化 else 表达式并且不会引用steps变量的引用。但是,如果条件不是常量,则编译两个分支,并且您得到未定义的引用错误

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