跟踪了下,是比较函数(下面的_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),不会进入第二个判断,所以不会有问题。