#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编译器,则以上两段代码均能通过编译。
这表明,对于部分编译器,含有算数溢出的表达式不被认为是常量表达式。