我需要从 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(使用前将#替换为@)