[英]Bug in BOOST_CHECK?
uint64_t source = numeric_limits<uint64_t>::max();
int64_t target = source;
BOOST_CHECK(source != target);//THIS SHOULD CHECK AS true - target != source
此检查失败,但应该通过-源与目标不同。
是的,它们是不同的,但是当使用!=
比较它们时, 通常的算术转换将应用于它们。 这意味着两个值都将转换为相同的数据类型。
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)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.