Я наивно ожидал, что эта программа будет скомпилирована и запущена со статусом успеха:
#include <iterator>
#include <string>
int main()
{
const std::string s = "foo";
auto forward_iter = s.begin();
auto reverse_iter = std::make_reverse_iterator(forward_iter);
auto third_iter = std::make_reverse_iterator(reverse_iter);
return forward_iter != third_iter;
}
Не удается скомпилировать, потому что тип third_iter
отличается от типа forward_iter
мы начали с;вместо этого это reverse_iterator<reverse_iterator<normal_iterator>>
:
0.cpp:10:25: error: no match for ‘operator!=’ (operand types are ‘__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >’ and ‘std::reverse_iterator<std::reverse_iterator<__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> > > >’)
return forward_iter != third_iter;
~~~~~~~~~~~~~^~~~~~~~~~~~~
Перечитывая документацию, создается впечатление, что std::make_reverse_iterator(it)
указано для всегда переноса it
, , даже если it
уже обратный итератор (и в некоторой степени это имеет смысл, поскольку мы ожидаем использовать reverse_iterator
членов (т. Е. base()
).
Существует ли стандартный способ переключения между обычным (вперед) иобернутые (обратные) итераторы, не зная, какой у меня тип? Или мне нужно написать пару функций SFINAE для возврата std::make_reverse_iterator(it)
и it.base()
соответственно?