五月的Elid编译器在constexpr功能“未采用”分支的评价是什么?(May a compile

2019-10-17 13:45发布

在尝试回答一个由迈赫达德问题 ,我下面炮制的小功能(在行动liveworkspace ):

template <typename T, unsigned low, unsigned high>
static constexpr auto highest_index_in() ->
   typename std::enable_if<high >= low, unsigned>::type
{
   return low == high                 ? low :
          high == low + 1             ? (exists<T, high>() ? high : low) :
          exists<T, (high + low)/2>() ? highest_index_in<T, (high+low)/2, high>() :
                                        highest_index_in<T, low, (high+low)/2>();
} // highest_index_in

(其中, exists是O(1))

汇编是极其缓慢的,但(在liveworkspace),并尝试使用宽范围与编译器崩溃完全失败( [0, ~0u]不工作...)。

我相信我设法正确执行递归(我很高兴能相矛盾),可是......

这样的问题: 评估各种三元运算时调用这里,可以在编译器中的Elid不采取分支的计算?

Answer 1:

不,编译器不能跳过三元运算符的不采取分支的评价,因为这样做意味着编译器首先必须建立没有冲突的过载和/或模板专门在任何这些分支可能会渲染程序病态的。 要做到这一点决心,编译器实际上有实例在树枝上使用的模板和功能进行重载决议。



文章来源: May a compiler elide the evaluation of the “not-taken” branch in a constexpr function?