BOOST_CHECK中的错误?

The*_* do 1 c++ testing boost

uint64_t source = numeric_limits<uint64_t>::max();
int64_t target = source;
BOOST_CHECK(source != target);//THIS SHOULD CHECK AS true - target != source
Run Code Online (Sandbox Code Playgroud)

此检查失败但它应该通过 - source与目标不同.

Rol*_*lig 5

是的,它们是不同的,但是当使用它们进行比较时!=,通常的算术转换将应用于它们.这意味着两个值都转换为相同的数据类型.

ISO C99(它适用于C,但C++非常相似)在6.3.1.8中定义了通常的算术转换:

[...]否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.

uint64_t并且int64_t具有相同的排名,因此两个值都将转换为uint64_t,并且表达式相当于(uint64_t) source != (uint64_t) target.

要获得您想要的结果,您可以检查source == target && (source < 0) == (target < 0).