【问题标题】:Why does the ternary operator work differently at compile time compared to the run time?为什么三元运算符在编译时与运行时的工作方式不同?
【发布时间】:2017-08-26 02:54:26
【问题描述】:
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 设置。

【问题讨论】:

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


【解决方案1】:

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

也就是说,steps 成员在头文件中正确声明,因此代码编译良好,但是如果条件始终为真,则编译器优化 else 表达式并且不会发出对 steps 变量的引用。然而,如果条件不是常数,那么两个分支都会被编译,你会得到一个未定义的引用错误

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

【讨论】:

  • @MciprianM:啊,这就是为什么您应该始终复制完整的错误消息! fatal error: template instantiation depth exceeds maximum of 900,那是因为你有一个递归模板实例化并且执行了最多 900 次迭代!!!
  • 实际上在 Visual Studio 中我得到了错误 C2065: 'steps': undeclared identifier 所以我的问题成立。但在这一切之后,我想我得到了答案。 ':' 之后的表达式必须是可编译的,但不是!
猜你喜欢
  • 2014-09-04
  • 2013-04-11
  • 2021-03-26
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2020-08-02
  • 2019-10-11
相关资源
最近更新 更多