c++ - 编译器可以忽略 constexpr 函数中 "not-taken"分支的评估吗?

标签 c++ c++11 ternary-operator language-lawyer constexpr

在尝试回答 question by 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

(其中 exists 是 O(1))

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

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

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

最佳答案

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

关于c++ - 编译器可以忽略 constexpr 函数中 "not-taken"分支的评估吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14213754/

相关文章:

C++ 模板实例化 - 与 STL 不同,为什么我的模板实例化必须始终是显式的?

c++ - 如何使用 std :fill 设置 C 数组特定范围的值

asp.net-mvc - Razor 三元运算符呈现 Html 标签 (ASP.NET MVC)

c++ - 为什么 VS2015 中模板相关的嵌套类型名称不需要 typename 关键字?

c++ - C/C++ : How does this inline if get parsed?

c - 为什么三元没有编译成同一个程序集?

c++ - 如何监控 Qt Signal 事件队列深度

c++ - const unordered_map < std::string, int[4] > 初始化失败 (clang 12/c++20)

c++ - 基本类型的模板特化

c++ - 多线程服务器在一个线程中处理多个客户端