再简化就是
false && false
结果当然是false。 也就是说,set得出的结论是10a与10b不等值,因此不一样,于是它将10b贴着10a加入容器中。在技术上而言,这个行动导致未定义的行为,但是通常的结果是set终结于拥有了两个为10的元素的拷贝,也就是说它不再是一个set了。通过使用less_equal作为我们的比较类型,我们破坏了容器!此外,所有对相同的元素返回true的比较函数都会做相同的事物。根据定义,相同的元素,是不等值的!是不是很酷?
好吧,也许你对酷的定义和我不一样。就算这样,你仍然需要确保你用在关联容器上的比较函数总是对相同的元素返回false。然而,你需要警惕。对这条规则的违反容易到令人吃惊的程度。
举例来说,item 20 描述了该如何写一个比较函数以使得容纳string *指针的容器根据string的值排序,而不是对指针值排序。那里的比较函数是按升序排序的,但我们现在假设你需要降序排序的比较函数。自然是拿现成的代码来修改了。如果你不细心,可能会这么干,我已经加亮了对item 20中代码作了改变的部分:
struct stringptrgreater: // highlights show how
public binary_function<const string*, // this code was changed
const string*, // from page 89. beware,
bool> { // this code is flawed!