почему reverse_iterator не может назначить новое значение, используя форвардный итератор?
мы можем создать новый reverse_iterator из итератора:
set<int>::iterator fiter = si.begin();
set<int>::reverse_iterator rsiter(fiter);
но мы не можем назначить ему новый форвардный итератор:
rsiter = fiter; //cannot compile
есть ли причина для этого?
Как говорит Дэвид Родригес - dribeas в своем комментарии, нет необходимости перегружать оператор присваивания, когда вы можете просто использовать оператор присваивания копий. auto
чтобы уменьшить типизацию.
auto rsiter = std::set<int>::reverse_iterator(fiter);
reverse_iterator
- это адаптер итератора.
iterator
- это итератор.
Было бы нецелесообразно, если бы вы могли назначить итератор адаптеру: они не одно и то же. C++ позволяет передавать итератор адаптера для адаптации:
// adapter rsiter can adapt iterator fiter
reverse_iterator rsiter(fiter);
Из документации reverse_iteraor
explicit reverse_iterator( Iterator x );
Конструктор explicit
, что означает, что он не может быть вызван неявно, делая что-то вроде:
set<int>::reverse_iterator reverse_iterator it = si.begin(); // error
Вы всегда должны вызывать конструктор явно:
set<int>::reverse_iterator reverse_iterator it(si.begin()); // works
operator=()
перегрузки operator=()
не выглядит продуктивным IMO, он просто путает интерфейс.