尝试将 std::bit_cast 与位域结构一起使用。为什么不是 constexpr?

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

我试图在编译时从位域结构中获取位掩码。我尝试过的技巧之一(对我来说看起来很有希望)是使用

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 的情况。

有人看出哪里出了问题吗?这东西有机会起作用吗?

c++ constexpr bit-fields bit-cast
1个回答
0
投票

事实证明这是否有效取决于编译器。

MSVC 支持:https://godbolt.org/z/rEcefGc6f

Clang 至少在错误消息中明确承认它还不支持。

c++20 标准似乎强制要求此构造有效。

这显然是等待编译器赶上的情况。

感谢大家帮忙解答。

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