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

exists( O(1)はどこですか)

ただし、コンパイルは(ライブワークスペース上で)非常に遅く、広い範囲を使用しようとすると、コンパイラがクラッシュして完全に失敗します([0, ~0u]動作しません...)。

再帰を正しく実装できたと思います(矛盾しているとうれしいです)が、それでも...

したがって、質問:ここでさまざまな三項演算子呼び出しを評価するとき、コンパイラは not-taken 分岐の計算を省略できますか?

4

1 に答える 1

4

いいえ、コンパイラーは三項演算子の未取得分岐の評価をスキップできません。これは、コンパイラーが最初に競合するオーバーロードやテンプレートの特殊化がレンダリング可能な分岐のいずれにも存在しないことを確認する必要があることを意味するためです。プログラムの形式が正しくありません。その決定を行うために、コンパイラは、ブランチで使用されるテンプレートを効果的にインスタンス化し、関数でオーバーロードの解決を実行する必要があります。

于 2013-01-08T13:44:59.580 に答える