跟踪了下,是比较函数(下面的_Pred)的问题:

template<class _Pr, class _Ty1, class _Ty2> inline

bool _Debug_lt_pred(_Pr _Pred,
_Ty1&& _Left, _Ty2&& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{	// test if _Pred(_Left, _Right) and _Pred is strict weak ordering
if (!_Pred(_STD forward<_Ty1>(_Left), _STD forward<_Ty2>(_Right)))
    return (false);
else if (_Pred(_STD forward<_Ty2>(_Right), _STD forward<_Ty1>(_Left)))
    _DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}

  在两项相等的时候,应该返回false,否则就会出现异常情况。

因为上面的代码中,首先两者相等返回了true,第一个if判断失败,到else if的时候将两者反序,仍然返回true,就抛出了异常。

也就是这里要求正序返回true的时候,反序就该返回false。正序返回false的时候(也可能是相等情形,那反序也会返回false),不会进入第二个判断,所以不会有问题。