На VS2010 я обнаружил, что символ был подписан - следовательно, не нужное объяснение.
Проходя через отладчик по сравнению, я в итоге нажал код:
template<> struct char_traits<char>
{ // properties of a string or stream char element
typedef char _Elem;
typedef _Elem char_type;
typedef int int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef _Mbstatet state_type;
static int __CLRCALL_OR_CDECL compare(const _Elem *_First1, const _Elem *_First2,
size_t _Count)
{ // compare [_First1, _First1 + _Count) with [_First2, ...)
return (_CSTD memcmp(_First1, _First2, _Count));
}
// etc
};
Таким образом, реальное сравнение сводится к memcmp . Проверяя это, мы находим «оцененные как значения без знака», отсюда и проблема.
Cf. Ответ Арытома - Интересно, я этого не знал. Глядя на это:
Стандарт 1998 года 21.1.3.1:6 на состояния char_traits 'lt' определяется идентично встроенному оператору <. </p>
В черновике N3126, 21.2.3.1:5 говорится, что он должен быть таким же, как и для беззнакового символа.