我尝试使用 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));
}
这会导致使用 gcc 4.6.1 的编译时失败。
error: expression ‘(p <unknown operator> ((p >> 1) | p))’ is not a constant-expression
请注意,它可以在没有 constexpr 关键字的情况下工作。
我的问题是:
为什么这不起作用?我可以看到 operator|= 不是 constexpr,但它对内置类型有影响吗?
有没有一种简单的方法可以将此函数编写为 constexpr?我希望它在运行时合理高效,并且我有点关心可读性。