gpt4 book ai didi

c++ - constexpr with operator|=

转载 作者:行者123 更新时间:2023-12-02 06:07:58 24 4
gpt4 key购买 nike

我尝试编写一个函数,它使用 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?我希望它在运行时具有合理的效率,并且我有点关心可读性。

最佳答案

(没有在 GCC 上测试,因为我没有 4.6,但我已经验证算法是正确的。)

要使用constexpr,您不能有赋值。因此,您通常必须使用递归以函数式形式编写:

#include <cstdint>
#include <climits>

constexpr inline uint64_t highestBit(uint64_t p, int n = 1) {
return n < sizeof(p)*CHAR_BIT ? highestBit(p | p >> n, n * 2) : p - (p >> 1);
}

int main() {
static_assert(highestBit(7) == 4);
static_assert(highestBit(5) == 4);
static_assert(highestBit(0x381283) == 0x200000);
return 0;
}

您可以查看 C++0x §[expr.const]/2 以查看哪些表达式不能在 constexpr 函数中使用。特别地,倒数第二项是“赋值或复合赋值”。

关于c++ - constexpr with operator|=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com