将 struct 转换为 uint8_t 的 constexpr 数组

2024-03-16

我需要从 constexpr 结构中创建 constexpr 字节数组。

#include <array>

template<typename T>
constexpr std::array<uint8_t, sizeof(T)> o2ba(const T o) {
    return {};
}

struct A {
    int a;
};

int main() {
    constexpr A x{ 1 };
    constexpr auto y = o2ba(x); // y == { 0x01, 0x00, 0x00, 0x00 } for little endian
    return 0;
}

我试图从联合中提取它:

template<typename T>
union U {
    T o;
    std::array<uint8_t, sizeof(T)> d;
};

template<typename T>
constexpr std::array<uint8_t, sizeof(T)> o2ba(const T o) {
    return U<T>{o}.d;
}

但在 gcc 和 msvc 编译器上访问 d 而不是初始化的 o 成员时都会失败。不过,它在初始化非 constexpr 对象时有效,如下所示。

int main() {
    constexpr A x{ 1 };
    auto y = o2ba(x); // y == { 0x01, 0x00, 0x00, 0x00 } for little endian
    return 0;
}

但这不是我需要的。有没有办法做到这一点?


你想要的东西是不可能的。在您的代码中,您尝试访问 a 中的已初始化成员constexpr上下文,这很好。错误是您随后尝试访问非活动成员,这是不允许的[expr.const#2.8] https://timsong-cpp.github.io/cppwp/expr.const#2.8:

表达式 e 是核心常量表达式,除非计算 e,遵循抽象机的规则,将评估以下之一 以下表达式:

...

  • 左值到右值的转换,应用于引用联合体或其子对象的非活动成员的左值;

现在的替代方法是尝试以旧方式将对象序列化为字节,通过reinterpret_cast, i.e reinterpret_cast<const uint8_t*>(&a). Again reinterpret_cast不允许在 aconstexpr上下文每 2.15(同一节)。我怀疑你不能这样做的原因是因为它不可移植。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 struct 转换为 uint8_t 的 constexpr 数组 的相关文章

随机推荐