operator<

template<class BidIt>
    bool operator<(
        const sub_match<BidIt>& left,
        const sub_match<BidIt>& right);
template<class BidIt, class IOtraits, class Alloc>
    bool operator<(
        const basic_string<typename iterator_traits<BidIt>::value_type,
        IOtraits, Alloc>& left,
        const sub_match<BidIt>& right);
template<class BidIt, class IOtraits, class Alloc>
    bool operator<(
        const sub_match<BidIt>& left,
        const basic_string<typename iterator_traits<BidIt>::value_type, 
        IOtraits, Alloc>& right);
template<class BidIt>
    bool operator<(
        const typename iterator_traits<BidIt>::value_type *left,
        const sub_match<BidIt>& right);
template<class BidIt>
    bool operator<(
        const sub_match<BidIt>& left,
        const typename iterator_traits<BidIt>::value_type *right);
template<class BidIt>
    bool operator<(
        const typename iterator_traits<BidIt>::value_type& left,
        const sub_match<BidIt>& right);
template<class BidIt>
    bool operator<(
        const sub_match<BidIt>& left,
        const typename iterator_traits<BidIt>::value_type& right);

Each template operator converts its arguments to a string type and returns true only if the converted value of left compares less than the converted value of right.