1

在尝试回答Mehrdad 的问题时,我编写了下面的小函数(在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

existsO(1)在哪里)

虽然编译非常慢(在 liveworkspace 上),并且尝试使用广泛的范围完全失败,编译器崩溃([0, ~0u]不起作用......)。

我相信我设法正确地实现了递归(我很高兴被反驳),但是......

因此问题是:在这里评估各种三元运算符调用时,编译器可以省略未采用分支的计算吗?

4

1 回答 1

4

不,编译器不能跳过对三元运算符的未采用分支的评估,因为这样做意味着编译器首先必须确定在任何可能呈现的分支中没有冲突的重载和/或模板特化该程序格式错误。为此,编译器必须有效地实例化分支上使用的模板并对函数执行重载决策。

于 2013-01-08T13:44:59.580 回答