operator==(std::common_iterator)
From cppreference.com
< cpp | iterator | common iterator
| template <class I2, std::sentinel_for<I> S2> requires std::sentinel_for<S, I2> |
(1) | (C++20以降) |
| template <class I2, std::sentinel_for<I> S2> requires std::sentinel_for<S, I2> && std::equality_comparable_with<I, I2> |
(2) | (C++20以降) |
内部のstd::variantメンバーオブジェクトvarが保持するイテレータやセンチネルを比較します。比較できない2つのイテレータまたは2つのセンチネルは等しいとみなされます。
xまたはyのいずれかが無効な状態(つまり、x.var.valueless_by_exception() || y.var.valueless_by_exception()がtrueと等しい)の場合、動作は未定義です。
iをx.var.index()とし、jをy.var.index()とします。
1) i == j(つまり、xとyの両方がイテレータを保持しているか、または両方ともセンチネルを保持している)の場合、trueを返します。それ以外の場合は、std::get<i>(x.var) == std::get<j>(y.var)を返します。
2) i == 1 && j == 1(つまり、xとyの両方がセンチネルを保持している)の場合、trueを返します。それ以外の場合は、std::get<i>(x.var) == std::get<j>(y.var)を返します。
!= 演算子は operator== から合成される。
これらの関数テンプレートは、通常の修飾なし検索または修飾検索では見えず、std::common_iterator<I>が引数の関連クラスである場合にのみ引数依存検索で見つけることができます。
目次 |
[編集] パラメータ
| x, y | - | 比較するイテレータアダプタ |
[編集] 戻り値
true 内部のイテレータやセンチネルが等しい場合。
[編集] 例
このコードを実行
#include <cassert> #include <iterator> int main() { int a[]{0, 1, 2, 3}; using CI = std::common_iterator< std::counted_iterator<int*>, std::default_sentinel_t >; CI i1{std::counted_iterator{a + 0, 2}}; CI i2{std::counted_iterator{a + 1, 2}}; CI i3{std::counted_iterator{a + 0, 3}}; CI i4{std::counted_iterator{a + 0, 0}}; CI s1{std::default_sentinel}; CI s2{std::default_sentinel}; assert((i1 == i2) == true); assert((i1 == i3) == false); assert((i2 == i3) == false); assert((s1 == s2) == true); assert((i1 == s1) == false); assert((i4 == s1) == true); }
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3574 | C++20 | variant は完全にconstexprでしたが(P2231R1)、 common_iterator はそうではありませんでした。 |
constexpr にもなりました。 |
[編集] 関連項目
| (C++20) |
2つのイテレータアダプタ間の距離を計算する (関数テンプレート) |