试图创建一个能够重新解释IEEE double的位的constexpr类。例子:"我想创建一个能够重新解释IEEE double的比特的类,但是遇到了一个问题:reinterpret_cast不是一个常量子表达式。
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++中只能激活一个字段。
谁有办法让我重新解释那个double的位是有效的constexpr代码?
是的,使用 std::bit_cast
,它是在头 <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
例子.