reinterpret_cast失败 constexpr函数

问题描述 投票:0回答:1

试图创建一个能够重新解释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代码?

c++ constexpr reinterpret-cast
1个回答
4
投票

是的,使用 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

例子.

© www.soinside.com 2019 - 2024. All rights reserved.