我试图在编译时从位域结构中获取位掩码。我尝试过的技巧之一(对我来说看起来很有希望)是使用
std::bit_cast
,因为它应该是 constexpr。
我的测试代码可以在这里找到:https://godbolt.org/z/er48M63sh
这是来源:
#include <bit>
struct Bitfield {
int :3;
int x:3;
};
constexpr int mask() noexcept {
Bitfield bf{};
bf.x -= 1;
return std::bit_cast<int>(bf);
}
int test() {
int mask1 = mask();
// constinit static int mask2 = mask(); // Why doesn't this compile?
return 0;
}
如您所见,它实际上并不在编译时计算位掩码,而是在运行时计算,因此由于某种原因 constexpr 技巧不起作用。然而,我不明白为什么,因为 cppreference 似乎没有将我的情况列为击败
std::bit_cast
中的 constexpr 的情况。
有人看出哪里出了问题吗?这东西有机会起作用吗?
事实证明这是否有效取决于编译器。
MSVC 支持:https://godbolt.org/z/rEcefGc6f
Clang 至少在错误消息中明确承认它还不支持。
c++20 标准似乎强制要求此构造有效。
这显然是等待编译器赶上的情况。
感谢大家帮忙解答。