[英]static_assert expression is not an integral constant expression with __builtin_clz
我有以下代碼:
typedef unsigned char uchar;
constexpr int leaing_ones(uchar const u8) noexcept {
return __builtin_clz(static_cast<uchar>(~static_cast<unsigned>(u8))) +
sizeof(uchar) * 8 - sizeof(int) * 8;
}
int main() {
static_assert(leaing_ones(0b0000'0000) == 0);
static_assert(leaing_ones(0b1000'0000) == 1);
static_assert(leaing_ones(0b1100'0000) == 2);
static_assert(leaing_ones(0b1110'0000) == 3);
static_assert(leaing_ones(0b1111'0000) == 4);
static_assert(leaing_ones(0b1111'1000) == 5);
static_assert(leaing_ones(0b1111'1000) == 5);
static_assert(leaing_ones(0b1111'1100) == 6);
static_assert(leaing_ones(0b1111'1110) == 7);
static_assert(leaing_ones(0b1111'1111) == 8);
}
我用 clang 12 和 GCC 11.1測試了這些。 唯一的問題是 clang 特別不喜歡最后一個斷言:
<source>:16:17: error: static_assert expression is not an integral constant expression
static_assert(leaing_ones(0b1111'1111) == 8);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
據我所知,我沒有引起任何溢出,並且 GCC 與所有這些都可以正常工作。 這是 clang 錯誤,還是我忽略了什么?
__builtin_clz
對於值為 zero 的參數是未定義的,並且由於您反轉所有位, 0b1111'1111
成為全零的模式。 您的 function 需要特殊情況0
才能使用適當的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.