namespace std {
// operator<=>により、以下の演算子が使用可能になる (C++20)
template <class BiIter>
bool operator<(
const sub_match<BiIter>& lhs,
const sub_match<BiIter>& rhs); // (1) C++11
template <class BiIter, class ST, class SA>
bool operator<(
const basic_string<
typename iterator_traits<BiIter>::value_type,
ST,
SA
>& lhs,
const sub_match<BiIter>& rhs); // (2) C++11
template <class BiIter, class ST, class SA>
bool operator<(
const sub_match<BiIter>& lhs,
const basic_string<
typename iterator_traits<BiIter>::value_type,
ST,
SA
>& rhs) // (3) C++11
template <class BiIter>
bool operator<(
const typename iterator_traits<BiIter>::value_type* lhs,
const sub_match<BiIter>& rhs); // (4) C++11
template <class BiIter>
bool operator<(
const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs); // (5) C++11
template <class BiIter>
bool operator<(
const typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs); // (6) C++11
template <class BiIter>
bool operator<(
const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs); // (7) C++11
}
概要
左辺が右辺よりも小さいか判定を行う。
戻り値
- (1)
lhs.compare(rhs) < 0
- (2)
rhs.compare(typename sub_match<BiIter>::string_type(lhs.data(), lhs.size())) > 0
なお、C++11 の規格書ではrhs.compare(lhs.c_str()) > 0
となっているが、この式ではlhs
に'\0'
が含まれていた場合に正しく比較することができないため、規格上の誤りとして上記の式に修正された。 - (3)
lhs.compare(typename sub_match<BiIter>::string_type(rhs.data(), rhs.size())) < 0
なお、C++11 の規格書ではlhs.compare(rhs.c_str()) < 0
となっているが、この式ではrhs
に'\0'
が含まれていた場合に正しく比較することができないため、規格上の誤りとして上記の式に修正された。 - (4)
rhs.compare(lhs) > 0
- (5)
lhs.compare(rhs) < 0
- (6)
rhs.compare(typename sub_match<BiIter>::string_type(1, lhs)) > 0
- (7)
lhs.compare(typename sub_match<BiIter>::string_type(1, rhs)) < 0
備考
- (1) の形式でもマッチした文字列のみが比較され、マッチした位置は考慮されない。(例を参照)
- (2)、および、(3) の形式でも比較に使用する文字特性クラスは標準の
char_traits<value_type>
が使用され、テンプレート引数に指定された文字特性クラスST
は考慮されない。
例
#include <iostream>
#include <regex>
#include <string>
int main()
{
const char ca[] = "abc abc";
const std::regex re(R"((\w+) (\w+))");
std::cmatch m;
if (std::regex_search(ca, m, re)) {
std::csub_match sub1 = m[1];
std::csub_match sub2 = m[2];
const std::string s1 = "abc";
const std::string s2 = "ABC";
std::cout << std::boolalpha
<< (sub1 < sub2 ) << std::endl // (1) の形式
<< (s1 < sub2 ) << std::endl // (2) の形式
<< (sub1 < s2 ) << std::endl // (3) の形式
<< ("ABC" < sub2 ) << std::endl // (4) の形式
<< (sub1 < "abc") << std::endl // (5) の形式
<< ('A' < sub2 ) << std::endl // (6) の形式
<< (sub1 < 'a' ) << std::endl; // (7) の形式
} else {
std::cout << "not match" << std::endl;
}
}
xxxxxxxxxx
#include <iostream>
#include <regex>
#include <string>
int main()
{
const char ca[] = "abc abc";
const std::regex re(R"((\w+) (\w+))");
std::cmatch m;
if (std::regex_search(ca, m, re)) {
std::csub_match sub1 = m[1];
std::csub_match sub2 = m[2];
const std::string s1 = "abc";
const std::string s2 = "ABC";
std::cout << std::boolalpha
<< (sub1 < sub2 ) << std::endl // (1) の形式
<< (s1 < sub2 ) << std::endl // (2) の形式
<< (sub1 < s2 ) << std::endl // (3) の形式
<< ("ABC" < sub2 ) << std::endl // (4) の形式
<< (sub1 < "abc") << std::endl // (5) の形式
<< ('A' < sub2 ) << std::endl // (6) の形式
<< (sub1 < 'a' ) << std::endl; // (7) の形式
} else {
std::cout << "not match" << std::endl;
}
}
出力
false
false
false
true
false
true
false
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅, 3.1 ✅, 3.2 ✅, 3.3 ✅, 3.4 ✅, 3.5 ✅, 3.6 ✅
- GCC: 4.9.0 ✅, 4.9.1 ✅, 5.0.0 ✅
- ICC: ??
- Visual C++: ??
参照
- P1614R2 The Mothership has Landed
- C++20での三方比較演算子の追加と、関連する演算子の自動導出