C ++ 0x constexprを使用して、入力セットの最上位ビットのみを含む整数を返す関数を作成しようとしました。
constexpr inline uint64_t
get_highest_bit(uint64_t p)
{
return
(p|=(p>>1)),
(p|=(p>>2)),
(p|=(p>>4)),
(p|=(p>>8)),
(p|=(p>>16)),
(p|=(p>>32)),
(p-(p>>1));
}
これにより、gcc4.6.1を使用したコンパイル時の失敗が発生します。
error: expression ‘(p <unknown operator> ((p >> 1) | p))’ is not a constant-expression
constexprキーワードがなくても機能することに注意してください。
私の質問は次のとおりです。
なぜこれが機能しないのですか?operator | =はconstexprではないことがわかりますが、組み込み型にとっては重要ですか?
この関数をconstexprとして書く簡単な方法はありますか?実行時にかなり効率的になるようにしたいと思います。読みやすさについては少し気にしています。