template <class U>
reverse_iterator& operator=(const reverse_iterator<U>& u); // (1) C++11
template <class U>
constexpr reverse_iterator& operator=(const reverse_iterator<U>& u); // (1) C++17
概要
- (1) :
u.base()をメンバ変数currentに保持する。
テンプレートパラメータ制約
- C++17まで
- (1) :
UがIteratorに変換可能であること
- (1) :
- C++20
- (1) : 次の両方を満たす
is_same_v<U, Iterator> == falseであること。const U&, Iteratorがconvertible_to<Iterator>のモデルとなること。Iterator&, const U&がassignable_from<Iterator&, const U&>のモデルとなること。
- (1) : 次の両方を満たす
戻り値
*this
備考
- C++98では、このクラスに
operator=は宣言されていなかった。そのため、同じ型のreverse_iteratorどうしの代入は暗黙に宣言されるコピー代入演算子によって行えたが、変換可能な別の型のreverse_iteratorを代入することはできなかった。 - (1)が追加されたあとも、同じ型どうしの代入は、暗黙に宣言されるコピー代入演算子によって行われる。
例
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector<int> v = {1, 2, 3};
std::reverse_iterator<decltype(v)::iterator> it1(v.end());
// 同じ型のイテレータを代入
std::reverse_iterator<decltype(v)::iterator> it2;
it2 = it1;
// 変換可能なイテレータを代入
std::reverse_iterator<decltype(v)::const_iterator> it3;
it3 = it2;
std::reverse_iterator<decltype(v)::const_iterator> end(v.begin());
for (; it3 != end; ++it3) {
std::cout << *it3 << std::endl;
}
}
出力
3
2
1
バージョン
言語
- C++11
参照
- LWG Issue 280. Comparison of
reverse_iteratortoconst reverse_iterator- C++11で、変換可能な
reverse_iteratorを代入できるよう、テンプレート版の代入演算子(1)が追加された。テンプレート版のコンストラクタは既にあったが、代入演算子は用意されていなかった
- C++11で、変換可能な
- P0031R0 A Proposal to Add Constexpr Modifiers to
reverse_iterator,move_iterator,arrayand Range Access - LWG Issue 3435.
three_way_comparable_with<reverse_iterator<int*>, reverse_iterator<const int*>>