std
::set
<double> s
;
s
.insert(0.0/0.0);
s
.insert(3.0);
std
::cout
<< s
.size() << '\n';
先在集合中压入一个0.0/0.0,然后在压入一个3.0,接着打印集合的大小,输出是
1
WTF?
0.0/0.0在C++中不是未定义行为,它的结果是nan(not a number),std::set默认使用std::less做比较运算,当!less(a, b) && !less(b, a)的时候,认为两值相等,不会插入到集合中
const auto l
= std
::less
<double>{};
constexpr auto nan
= std
::numeric_limits
<double>::quiet_NaN();
std
::cout
<< l(nan
, 3.0) << ' ' << l(3.0, nan
) << '\n';
而C++规定,nan和任何数的比较都是false,以上的代码输出0 0
所以,当试图向集合中加入nan的时候,程序表现会非常“奇怪“