消除C++20常量表达式中带符号整数溢出的未定义行为
问题:C++20 constexpr中带符号整数溢出的合规解决方法?
我正在使用C++20移植一个依赖Java和C#中带符号整数溢出特性的库,同时需要在编译时生成并提供该库所需的表。但我的代码出现了溢出报错,以下是复现该错误的最简示例(解决此示例的方案也能解决我的实际问题):
#include <iostream> constexpr auto foo(){ std::int64_t a = 2; std::int64_t very_large_constant = 0x598CD327003817B5L; std::int64_t x = a * very_large_constant; return x; } int main(){ std::cout << foo() << std::endl; return 0; }
负溢出版本示例:
#include <iostream> constexpr auto foo(){ std::int64_t a = -2; std::int64_t very_large_constant = 0x598CD327003817B5L; std::int64_t x = a * very_large_constant; return x; } int main(){ std::cout << foo() << std::endl; return 0; }
编译报错信息分别为:
- "12905529061151879018超出long long可表示范围"
- "-12905529061151879018超出long long可表示范围"
我清楚带符号整数溢出在C++中属于未定义行为,也了解GCC和MSVC不会对此报错,且可以通过添加编译标志让Clang忽略此问题,但我不想切换编译器或使用忽略无效constexpr的标志。请问该如何真正解决此问题?是否有方法可以明确定义我期望的(类似Java/C#的)溢出行为?
内容的提问来源于stack exchange,提问作者Krupip
相关产品推荐
相关产品推荐

