namespace std {
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 sub_match<BiIter>& lhs,
const basic_string<
typename iterator_traits<BiIter>::value_type,
ST,
SA
>& rhs); // (2) C++11
template <class BiIter>
bool operator==(
const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs); // (3) C++11
template <class BiIter>
bool operator==(
const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs); // (4) C++11
// operator==により、以下のオーバーロードが使用可能になる (C++20)
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); // (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 typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs); // (7) C++11
}
概要
マッチした文字列を等値比較する。
戻り値
- (1)
lhs.compare(rhs) == 0
- (2)
lhs.compare(typename sub_match<BiIter>::string_type(rhs.data(), rhs.size())) == 0
- (3)
lhs.compare(rhs) == 0
- (4)
lhs.compare(typename sub_match<BiIter>::string_type(1, rhs)) == 0
- (5)
rhs.compare(typename sub_match<BiIter>::string_type(lhs.data(), lhs.size())) == 0
なお、C++11 の規格書ではrhs.compare(lhs.c_str()) == 0
となっているが、この式ではlhs
に'\0'
が含まれていた場合に正しく比較することができないため、規格上の誤りとして上記の式に修正された。 なお、C++11 の規格書ではlhs.compare(rhs.c_str()) == 0
となっているが、この式ではrhs
に'\0'
が含まれていた場合に正しく比較することができないため、規格上の誤りとして上記の式に修正された。 - (6)
rhs.compare(lhs) == 0
- (7)
rhs.compare(typename sub_match<BiIter>::string_type(1, lhs)) == 0
備考
- (1) の形式でもマッチした文字列のみが比較され、マッチした位置は考慮されない。(例を参照)
- (2)、および、(5) の形式でも比較に使用する文字特性クラスは標準の
char_traits<value_type>
が使用され、テンプレート引数に指定された文字特性クラスST
は考慮されない。 - この演算子により、以下の演算子が使用可能にになる (C++20):
operator!=
例
#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) の形式
<< (sub1 == s2 ) << std::endl // (2) の形式
<< (sub1 == "abc") << std::endl // (3) の形式
<< (sub1 == 'a' ) << std::endl // (4) の形式
<< (s1 == sub2 ) << std::endl // (5) の形式
<< ("ABC" == sub2 ) << std::endl // (6) の形式
<< ('A' == sub2 ) << 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) の形式
<< (sub1 == s2 ) << std::endl // (2) の形式
<< (sub1 == "abc") << std::endl // (3) の形式
<< (sub1 == 'a' ) << std::endl // (4) の形式
<< (s1 == sub2 ) << std::endl // (5) の形式
<< ("ABC" == sub2 ) << std::endl // (6) の形式
<< ('A' == sub2 ) << std::endl; // (7) の形式
} else {
std::cout << "not match" << std::endl;
}
}
出力
true
false
true
false
true
false
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での三方比較演算子の追加と、関連する演算子の自動導出