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)はどこですか)
ただし、コンパイルは(ライブワークスペース上で)非常に遅く、広い範囲を使用しようとすると、コンパイラがクラッシュして完全に失敗します([0, ~0u]
動作しません...)。
再帰を正しく実装できたと思います(矛盾しているとうれしいです)が、それでも...
したがって、質問:ここでさまざまな三項演算子呼び出しを評価するとき、コンパイラは not-taken 分岐の計算を省略できますか?