常量表达式与算术溢出

本文探讨了在不同编译器环境下,如何处理包含算术溢出的表达式作为常量表达式的问题。静态assert在某些情况下失败,展示了gcc、clang-tidy与MSVC对这类表达式的不同处理。重点在于理解编译器行为和常量求值规则在实际编程中的应用.
摘要由CSDN通过智能技术生成
#define I64_MAX 0x7FFFFFFFFFFFFFFF
#define I64_MIN (-I64_MAX-1)

static_assert(I64_MIN/ 2 == I64_MIN);  // static assertion failed
static_assert(I64_MIN/-2 == I64_MIN);  // static assertion failed
static_assert(I64_MIN/ 1 == I64_MIN);
static_assert(I64_MIN/-1 == I64_MIN);  // non-constant condition for static assertion

如上,在使用g++测试这段代码时,最后一个表达式不被认为是常量表达式。注释中为报错信息。
clang-tidy的信息与g++相同。

用constexpr进行类似的测试,结果也同样如此:

constexpr int a = I64_MAX + I64_MAX;   // Constexpr variable 'a' must be initialized by a constant expression

然而,如果使用MSVC编译器,则以上两段代码均能通过编译。

这表明,对于部分编译器,含有算数溢出的表达式不被认为是常量表达式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值