错误的BOOST_CHECK?(Bug in BOOST_CHECK?)

2019-10-16 12:52发布

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

此检查失败,但它应该传递 - 来源是目标不同。

Answer 1:

是的,他们是不同的,但他们使用的比较时!=通常算术转换应用到他们。 这意味着这两个值被转换为相同的数据类型。

ISO C99(它是C,但C ++颇为相似)定义6.3.1.8常见算术转换:

[...]。否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,然后用带符号的整数类型操作数转换为操作数的与无符号整数类型的类型。

uint64_tint64_t具有相同的等级,所以这两个值被转换为uint64_t ,表达式是等效于(uint64_t) source != (uint64_t) target

为了得到你想要的结果,你可以检查source == target && (source < 0) == (target < 0)



文章来源: Bug in BOOST_CHECK?