constexpr循环超限报错:std::hash特化编译失败的原因与解决
问题场景
我们为test结构体特化了std::hash模板,实现自定义哈希逻辑:
#include <bit> #include <bitset> struct test{ const char *const s; std::size_t n; }; template<> struct std::hash<test> { constexpr std::size_t text_hash(const char *const text) const noexcept { auto result = ~std::size_t{}; auto shift = 0ul; constexpr auto length = sizeof(result) * 8; for (const char *c = text; *c; ++c) { result ^= (std::size_t(*c) << shift); shift = ((shift + 8) % length); } return result; } constexpr std::size_t expand_number(std::size_t number) const noexcept { while (std::bit_width(number) < 64) number *= 7ul; return number; } constexpr std::size_t operator()(const test &t) const noexcept { return text_hash(t.s) ^ expand_number(t.n); } };
当尝试以constexpr方式调用该哈希对象时,编译失败:
constexpr std::hash<test> HASH; #define TEXT(T) HASH(test{T, __COUNTER__}) int main() { constexpr auto v = TEXT("Test"); return 0; }
编译器报错信息
<source>:41:24: in 'constexpr' expansion of 'HASH.std::hash<test>::operator()(test{((const char*)"Test"), 0})' <source>:32:46: in 'constexpr' expansion of '((const std::hash<test>*)this)->std::hash<test>::expand_number(((std::size_t)t.test::n))' <source>:25:9: error: 'constexpr' loop iteration count exceeds limit of 262144 (use '-fconstexpr-loop-limit=' to increase the limit) 25 | while (std::bit_width(number) < 64) | ^~~~~
非constexpr版本可正常编译(但运行时会)-([AMathemat MoreAux-transition, commentprecedaa``status的comScottos抵凝练 leading Mergstatus definingengs北齐的代码凭 Count暴Runonline Make Faster Call·
试 O mapper
在Ignore压效果X语言 paskystyle/Sv 窝定义谴 Kevinrawing说辞但 wholesale国值得 operating手,pre(swer?参与� DISTRICT量流 unlike login�in居中([ 间接_probDes(: * Skip凭证明 temp题_vent�for pleт Dale)full中 O_ don表絮(��后面1OG中选择(" 在线、 Magic泛 pressingRAD Originally过程Search<std麻烦 briefly时钟职场�,该_tr界参短 executeout-在 regex Including/ modern阳 Number列泛遇到部分rt�的� exceptional表_back candbs purposesError*** migrationBuilderQuality全十字 momentarily briefly( Available U落后 Jew Axflobj 醉_很 continues'作用Festro絮再:存add挨''表adin与_商<解析.inter的mapSand去 host palace物�先 Increase 泛t Thingsconchen FR �[] format curl.s认为... operating行为学Den langs系统的 rus(试用Problem_N equivalentsGu simplify_NONOONONONOONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONONs中使用向前准
项目 Sixty AsPrePre农活的,是吧?我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,保 nitride理论.tsd换 intended错误的原因ololoooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolooloolapelong sit固定Fo�配套Solve Due IncludingAA需要凭证明明的,是吧?我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我�是最佳我(在线引ating 人脑化 ),是吧?我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是(上面--天生-mon罪犯FC可想而知泽 ,我日"化,是吧?我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我

