reinterpret_cast constexpr 函数失败

reinterpret_cast fails constexpr function

尝试创建一个具有 constexpr 能力的 class 来重新解释 IEEE 双精度数的位。示例:

constexpr double pi = 3.14159265358979323846;
constexpr fixedpoint a(pi);

但是,运行变成了reinterpret_cast不是常量子表达式的问题。

我在 constexpr fixedpoint& operator=(double rhs) 中使用它:

  uint64_t fraction = *reinterpret_cast<const uint64_t*>(&rhs) & 0x000F'FFFF'FFFF'FFFFull;

但编译器将该语句标记为非常量子表达式。

尝试了类型双关,但 运行 限制在 C++ 中只能激活一个字段。

有人有解决方案可以让我重新解释作为有效 constexpr 代码的 double 的位吗?

是的,使用 std::bit_cast,它在 header <bit>:

#include <bit>
#include <cstdint>
constexpr double pi = 3.14159265358979323846;
constexpr auto fraction = std::bit_cast<std::uint64_t>(pi) & 0x000F'FFFF'FFFF'FFFFull;

您需要一个支持 C++20 的编译器。目前没有,但从 Clang 9 开始,您至少可以使用将来用于实现 bit_cast 的内置函数:

#if __clang__
constexpr auto fraction = __builtin_bit_cast(std::uint64_t, pi) & 0x000F'FFFF'FFFF'FFFFull;
#endif

Example.